Администрирование глазами C++ программиста

    Продолжаем цикл пятничных статей "X глазами C++ программиста" (1, $$). В этот раз под катом вас ждут впечатления заядлого С++ программиста от мира администрирования. Боль, страдания, радости и прочие эмоции как всегда вынесены под спойлеры.

    Надеюсь будет интересно профессиональным администраторам посмотреть на потуги С++ника, ну а С++ разработчикам узнать для себя что-то новое.

    Хостинг


    Пораскинув мозгами и калькулятором выяснилось, что намного дешевле и проще купить хостинг у одного из хостинг провайдеров. Так если разворачивать сервер в «домашних условиях», то придется потратиться на UPS, статический внешний IP, саму машину и прочие мелочи, вроде электричества.
    ... и что? Неужто нет старой машины?
    Знакомые, для которых делался проект, напрочь отказывались круглосуточно держать включенным шумящий Pentium4 в своём доме. И аргумент «все серьезные дядьки так делали» не прокатывал.


    Купить хостинг оказалось легко, выяснилось что зарубежные раза в два дешевле наших. Взвесив все за и против была выбрана ОС Ubuntu 14.04
    ... и что же это за 'за' и 'против'?
    Решение было выбрано на основе следующих многочисленных факторов:
    • мне нравится Ubuntu


    Данный подход к выбору ОС (да и языка разработки) является кране популярным; всегда хотелось опробовать данную методику.


    После покупки хостинга и выбора ОС из выпадающего списка, началась настройка сервера по SSH.
    ... и как ощущения?
    Сколько раз в вашей жизни батарейки в пульте для телевизора садились или пульт терялся?

    А теперь представьте что в этом случае вы не можете долбануть рукой, перевоткнуть в сеть подглючивший советский телек, по которому как раз начинается ваша самая нелюбимая передача.

    Так вот, в случае удаленного сервера, стресс от «потери пульта» намного сильнее.


    Bash уязвимость и SSH


    Так уж мне повезло, что начало моей админской практики выпало не период нахождения кучи критических уязвимостей в bash. Находясь под общим впечатлением, решил минимизировать использование shell во всех сервисах начиная с SSH. Под раздачу попало приветственное сообщение при логине (message of the day). Так же в SHH выключил X forwarding и PAM, запретил root, сменил порт по умолчанию, разрешил авторизацию только по асимметричным ключам + всякая мелочёвка.
    ... знаем вас халявщиков, без красивых окошек не кайф?
    Да нормально. Больше расстроило отсутствие message of the day. Оно такое сипапутненькое информативное. Даже сделал скриптик, чтобы из консоли можно было его вызвать.


    В процессе работы открыл для себя
    ssh -L удаленный_порт:localhost:5432 me@top-me.org -N
    

    Отличная вещь для администрирования баз данных и прочих мелочей: на удаленноё машине ничего не поменялось, однако ты уже можешь достукиваться до localhost портов удаленной машины как к портам на своей машине.
    ... понравилась фишка?
    Настолько вписалась в мои нужды, что в пятницу с друзьями пили за здоровье «ssh -L»!


    Ещё одной приятной фишкой оказалось, что `tail` может принимать несколько файлов на вход и показывать их одновременно в консоли.
    ... чем это клёво?
    Делаем:
    tail -f /var/log/kern.log /var/log/auth.log /var/log/nginx/error.log /var/log/nginx/access.log
    


    Теперь все логи отображаются в одной консоли в режиме реального времени:
    ==> /var/log/kern.log <==
    Mar 16 10:49:39 rating kernel: [2226306.618927] --- top-me.org: possible port scan--- IN=eth0 OUT= MAC=04:01:2a:64:3c:01:28:8a:1c:64:cb:f0:08:00 SRC=184.105.247.244 DST=80.240.141.163 LEN=30 TOS=0x00 PREC=0x00 TTL=56 ID=39877 DF PROTO=UDP SPT=48784 DPT=5351 LEN=10 
    Mar 16 10:53:57 rating kernel: [2226564.521544] --- top-me.org: possible port scan--- IN=eth0 OUT= MAC=04:01:2a:64:3c:01:28:8a:1c:64:cf:f0:08:00 SRC=207.30.132.123 DST=80.240.141.163 LEN=72 TOS=0x08 PREC=0x00 TTL=42 ID=3852 DF PROTO=UDP SPT=53 DPT=11653 LEN=52 
    
    ==> /var/log/auth.log <==
    Mar 16 11:01:17 rating sshd[31323]: Accepted publickey for ANONYMOUS from 66.66.66.66 port 66 ssh2: RSA 
    
    ==> /var/log/nginx/error.log <==
    PHP message: redirecting to http://top-me.org/" while reading response header from upstream...
    
    ==> /var/log/nginx/access.log <==
    66.66.21.66 - - [04/Mar/2015:12:29:25 +0300] "GET /land_job HTTP/1.1" 200 2601 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0" "-"
    


    Блеск :)


    Iptables


    Все мои немногочисленные знакомые админы настраивают фаерволы. В начале, я не ожидал большого PROFITа, но пошёл на поводу у традиции. По первым мануалам казалось что Iptables монстр и в нем не разобраться. Однако, спустя небольшое время, инструмент приоткрыл свои тайны:
    • Можно логировать запросы по закрытым портам
      ... а смысл?
      Смысла не много, но можно узнать интересные вещи. Так оказалось что любимый порт мошеников: 5060. На этом порту по умолчанию работает IP телефония (SIP протокол).

    • Можно банить пользователей
      ... почувствовал власть и рад?
      Да. Сделал специальное правило, куда сваливались все попытки взлома (обращения по закрытому порту, кривые TCP пакеты, spoofing). Пять попыток — и в бан на 10 минут. А неудачливый ломальщик в этот момент, попадая на открытый порт, получит ответ что порт закрыт.

    • Можно запрещать Forwarding
    • Можно запрещать протоколы частично и т.д.


    Iptables — шикарная штука!
    ... а что это эмоции не под спойлером?
    Под спойлер все эмоции не поместились. Iptables настолько шикарно-блистательно великолепны, что некоторые поэмы стоит посвящать не женщинам а этому инструменту!


    Ну а для желающих проверить бан по iptables:
    • Стучимся в закрытый порт пару раз: top-me.org:8080
    • Проверяем что мы забанены: http://top-me.org


    Nginx


    По nginx огромное количество мануалов по настройке, при том многие из них на русском языке. К несчастью это проблема — некоторые из статей написаны людьми, встречавшимися с nginx только в теории.

    Примеры плохих советов:
    • Рекомендовалось писать «expires modified 30d;». Автор уверял, что это значит, что ресурс будет перекеширован клиентом, если он изменился или если прошло 30 дней. А это не так работает!
      ... сам виноват, оно так работать не может!
      Да, как-то сглупил
    • Рекомендовалось блокировать всех людей/ботов, пришедших с порнушных ресурсов!
      ... в теории то, полезный совет!
      Ага, но вот только при переходе с Yandex Поиска, куча всякого шлака шлётся в заголовках, и слово «sex» там встречается на удивление часто!


    В Nginx всё логично и разумно. Однако все советы из статей стоит перепроверять по официальной документации. Да и это не гарантирует 100% работоспособность.
    ... что понравилось в Nginx?
    Особо понравилось решение с `include fastcgi_params`: прописал, и все Fastcgi настройки по умолчанию выставились для локации; что не устраивает — можно ниже в конфиге подправить.


    Закручиваем гайки


    Думаю многие видели веб сервера, отдающие по ошибке файл с PHP кодом. Хотелось обезопасить себя от таких ошибок конфигурирования, поэтому настроил запуск nginx и php интерпретатора под разными пользователями. Был написан скрипт, выставляющий права на файлы и дериктории так, чтобы nginx не имел доступа к директориям php, а php не имел доступа к статическим ресурсам.
    ... и кого ты хочешь удивить этой тривиальной вещью?
    Тех, у кого сервера порой отдают php файлы.


    Неуловимый Джо

    Есть вопрос, который терзает меня уже длительное время.

    Допустим я кое-как защитился от доступа по сети и усложнил жизнь взломщику. Однако, что мешает хостеру просмотреть мои файлы и данные? Да, это звучит как анекдот про Неуловимого Джо, который хостеру даром не нужен, но всё равно…
    ... а вам есть что скрывать?
    Нет, и это не ваше дело.
    TOR project


    Вопрос остаётся, быть может кто-то знает на него ответ?


    Итоги


    Рекомендую попробовать каждому поадминистрировать сервер. Отличная возможность обзавестись новыми друзьями-инструментами, открыть в старых нечто новое, задуматься о вопросах, которые раньше не приходили в голову.

    Бонусом для разработчиков будет большое количество примеров того, как должны выглядеть конфиги в программах и полезные идеи для конфигов в проектах.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 50

    • UFO just landed and posted this here
        +2
        >Да, это звучит как анекдот про Неуловимого Джо, который хостеру даром не нужен, но всё равно…
        Система виртуализации? Если это xen/kvm, то в принципе можно создать файлик, в нем создать шифрованную FS, и монтировать ее, но тут сразу 2 «но»:
        1) При перезагрузке придется лазить ручками вводить пароль
        2) Хостер управляем памятью. То есть чисто теоретически ему никто не сможет помешать читать и писать «вашу» память.

          0
          Да, шифрованная файловая система особо не помагает из-за того, что в памяти все содержится в расшифрованном виде (особенно критично для баз данных, которые держат самые популярные данные в кэше).

          Дополнительными минусами будет падение производительности, возможность перехватить пароль и неработоспособность системы после сбоя (пока админ не введет пароль).
          +10
          Подскажите, о чём пост?
            +5
            Программисты познают системное администрирование. Есть ещё второй том ­-- «Сисадмины познают программирование». Жанр — саспенс-триллер. Уже который год зачитываюсь.
            +3
            Так а где C++? Надеюсь хоть серверная логика-то была написана на нем?
              0
              Нет, не была :)

              Серверная логика на PHP и функциях PostgreSQL (не к чему лупить из С++ пушки по воробьям; PHP было более чем достаточно для решения задач). От С++ в статье лишь мой взгляд на вещи, да излишняя дотошность в мелочах.
              +9
              После стольких лет, почему я не знал что так можно с tail… :(
                +2
                С tail вообще забавная история:

                Однажды я заметил что tail ест меньше ресурсов процессора чем less. Решившись заглянуть в исходники натолкнулся на фишку со множеством файлов на вход. Думал пасхалка… Оказалось что нет:
                VirtualBox:~$ man tail
                
                DESCRIPTION
                       Print  the  last  10  lines of each FILE to standard output.  With more
                       than one FILE, precede each with a header giving the file  name.
                
                  +1
                  Но ещё больше удовольствия вы получите от специализированных вещей, multitail например.
                  0
                  А что будет в случае спуфинга? Если злоумышленник отправит по 10 SYN-пакетов с мульона разных адресов? У вас в iptables миллион правил окажется? Похоже на прекрасную атаку.
                    +1
                    Вот, как раз про это автор не раскрыл тему ipset
                      0
                      Если вы считаете, что 1М забанненых адресов много весят — то миллион айпи адрессов это чуть более 4мб оперативы. Ну ~20 мб вместе с ttl и временем получения пакетов. Не так уж и много.

                      Если у злоумышленника есть возможность контролировать сразу миллион машин — то у него будет десяток более простых способов нагадить. И iptables тут скорее всего не спасут.
                        +1
                        Дело не в том, сколько они весят. А в том, что на каждый входящий пакет машине придётся делать перебор миллиона записей в таблице iptables.
                        Чтобы отправить пакет с поддельным IP-адресом, контролировать машины не надо. ru.wikipedia.org/wiki/IP-%D1%81%D0%BF%D1%83%D1%84%D0%B8%D0%BD%D0%B3
                          0
                          Насколько я помню по документации, там адреса хранятся в хэш-таблице, а соответсвенно это не перебрать миллион записей, а за константное время получить ответ.
                            0
                            Почитал интернеты. Оказывается, есть классная штука — ipset. Но ее надо явно использовать. Если просто добавлять правило в iptables на каждый адрес, то будет тормозить при большом числе правил.
                      +1
                      Ubuntu?
                      Ну тогда надо еще настроить ip6tables — ipv6 вам дали же?
                      А вот еще суперская вещь — byobu. Это обертка над tmux или screen, которая позволяет консольной сессии продолжаться даже если отвалится ssh.
                      А что использовалось для бана iptables? fail2ban какой-нибудь?
                        0
                        Объясните пожалуйста человеку, не понимающему зачем нужен tmux, если есть screen, зачем нужен byobu?
                          +3
                          И, заодно, понимающему, зачем нужен tmux, чем он в деталях отличается от screen, и пользовавшемуся обоими много лет.
                            0
                            Если у вас есть screen, то tmux, в общем-то, не нужен. А вот на роутере у меня tmux потому что туда screen просто жалко ставить, уж очень места мало.
                              0
                              Я пользовался screen как основным средством мультиплексирования терминалов года три. Потом упёрся в его ограничения, расстроился и бросил совсем. Потом перешёл на tmux и с тех пор пользуюсь только им. Я как раз тот самый человек, у которого постоянно существует несколько сессий с множеством окон на нескольких разных машинах для выполнения разной работы, при этом сессии могут существовать месяцами. Я часть целевая аудитории этих программ. И я со всей ответственностью заявляю: tmux — это развитие идей screen в правильном направлении. Впрочем, в контексте отваливающихся SSH-соединений действительно всё равно чем пользоваться, хоть nohup.
                                0
                                В контексте отваливающихся ssh соединений надо пользоваться mosh
                                  0
                                  Как только оно IPv6 научится, так сразу. А пока что не надо.
                            0
                            byobu — обертка, которая позволяет сделать screen или tmux более удобным. Мы юзаем screen (при первом запуске делаем byobu-select-backend и выбираем screen).
                              0
                              Это я в гугле прочитал. А в деталях?
                                0
                                Известные мне отличия минимальны — я почти не пользовался screen и не пользовался tmux.
                                А с byobu поступем так — после его установки на серверах и выбора бэкенда запускем byobu-enable, и после следующего логина сразу запускается screen с некоторыми базовыми показателями по системе: сколько есть обновлений, сколько занято памяти, процессора. Плюс добавляются бинды на F*, но там снова-таки нет никаких особенностей.
                                Собственно, то же самое делается и для tmux.
                                  +1
                                  То есть, это для тех, кто не осилил .tmux.conf или .screenrc, без добавления каких-то уникальных полезных функций?
                                    +1
                                    Похоже на то.
                              0
                              Если правильно помню:
                              • screen, в отличие от tmux`а то ли до недавнего времени застыл в развитии, то ли просто медленно развивался.
                              • у tmux`а лучше со сплитами
                              • у tmux`а можно прицепиться к окнам не «отрывая» предыдущего прицепившегося


                              Сам долго сидел на screen`е и не видел особого смысла переходить на tmux, при том, что был уже конфиг для screen-щиков. Но приспичило мне получить 256 цветов в консоли. В скрине при этом то ли что-то отвалилось в консоли, то ли в vim`е, быстро разобраться не удалось… Ради интереса поставил tmux, все завелось с полпинка, еще где-то час заняло допилить конфиг до того, к чему привык со screen`ом, и все.
                                0
                                screen устарел.
                                tmux — новый скрин. Больше комфорта и удобства. Поддержка современных терминалов улучшена.
                                Если вы активно пользуетесь скрин, просто попробуйте недельку попользоваться tmux и ответ у вас будет собственный.
                              0
                              Никогда не понимал всех этих приколов с перевешиванием портов, баном и тд. Лишняя работа, не прибавляющая безопасности ни на капельку. Или у вас нормальные пароли стоят и их никогда не подберут, или у вас плохие пароли и скрывать это нестандартным портом неправильно.
                                +1
                                Кроме «честного» подбора паролей, есть ещё и уязвимости.
                                  +1
                                  Не спасёт это от уязвимостей. 0-day уязвимость никто ботами применять не станет, она слишком ценная, её для направленных атак берегут. Исправленные уязвимости патчатся оперативно. А от направленной атаки защищаться перевешиванием порта это примерно как mac-фильтр в модеме. Вам он доставит больше неудобств, чем злоумышленнику.

                                  Да и в openssh уязвимость сложно найти, имхо. Весьма безопасная программа.
                                    +1
                                    Не спасёт это от уязвимостей. 0-day уязвимость никто ботами применять не станет, она слишком ценная, её для направленных атак берегут.

                                    Это какой-то фундаментальный закон вселенной или вы так себя успокаиваете?

                                    Вам он доставит больше неудобств, чем злоумышленнику.

                                    Все мнимые неудобства исчезают после man ssh_config.
                                      0
                                      > Это какой-то фундаментальный закон вселенной или вы так себя успокаиваете?

                                      Да, это основы безопасности и экономики.
                                        0
                                        А можно про эти основы где-то прочитать в конкретном месте? Ну там, учебник какой-то или статью в научном журнале?
                                  +2
                                  Долбление, например, на открытый 22-й порт создает лишнюю нагрузку
                                    0
                                    … настолько мизерную, что она незаметна
                                    … особенно если у вас веб сервер

                                    максимум что будет это поиск rDNS у IP, что обычно отключается для ускорения логина.
                                      +1
                                      В последней версии OpenSSH 6.8 rDNS Lookup отключен по умолчанию.
                                      Ну и китайцы здорово перебирают пароли, я всем советую ставить sshguard. Он заметно меньше потребляет ресурсов, нежели более популярный fail2ban.
                                        0
                                        пусть перебирают до посинения — авторизация по ключу.

                                        не спорю — если делать то делать нормально: port knocking или vpn до сервера + ssh слушающий только на интерфейсе vpn итд.
                                        речь о том, что делать это совсем не обязательно сейчас
                                          +1
                                          А за vpn'ы всякие вам потом такое «спасибо» скажут — не сомневайтесь.
                                          Я все же придерживаюсь мнения — лучше сменить порт и настроить какой-нибудь автобан.
                                          0
                                          Как к sshguard прикрутить защиту http auth (nginx/apache)?
                                            +1
                                            Прикрутите к нему как-нибудь log sucker
                                      +3
                                      Есть куча ботов, которые не сканят все открытые порты, а ломятся в набор портов с интересующими их сервисами: 22, 3389, 5900 и пр., поэтому есть смысл менять дефолтный порт.
                                      Есть также смысл использовать защиту от брутфорса (автоматический бан типа fail2ban).
                                        0
                                        Даже самый простой простой пароль (8 букв) подобрать практически невозможно. А уж посложнее (12 бУквоцифр) и теоретически невозможно. Не ставьте пароль «toor» и всё. Пусть себе брутфорсят на здоровье.
                                          +1
                                          Да-да, я как-то халтурил на одних товарищей, у них удаленно в нужный мне для работы терминал можно было попасть только через VNC, предварительно прокинув порт на другой сервак по ssh с овер 9000 указанных опций, которыми бы я никогда не воспользовался. При этом пароли были 123456, а в ssh было достаточно всего 2 ключа. Порты конечно же везде нестандартные. Ах, да, они еще наотрез отказывались пользоваться приватным git-репозиторием, ибо боялись за какую-то конфиденциальность, поэтому я вручную через всю эту жопу загружал им туда архивы каждого «коммита». Но зато какому-то неизвестному чуваку (т.е. мне) вообще без задней мысли выдали рутовые пароли. Wut?
                                      +2
                                      что мешает хостеру просмотреть мои файлы и данные

                                      Может все-таки помешает как раз таки отказ от использования интерпретируемого языка :)
                                        +6
                                        Зачем заставлять читающего постоянно кликать спойлеры с одним предложением? Неужели не нашли другого способа сделать отступление?
                                          0
                                          Предлагаю выпить ещё за здоровье ssh [-g] -D.
                                            +1
                                            Теги, конечно, никто не читает, но поиск-то по ним, небось, работает…

                                            Only users with full accounts can post comments. Log in, please.