Общий обзор стандартных средств наблюдений за системой

    Уровень сложности: начальный

    Вводный обзор стандартных инструментов GNU/Linux должен помочь начинающим пользователям Linux контроллировать работу ОС. Используемые приложения, как правило, включены в поставку известных дистрибутивов. Полезным побочным эффектом я считаю возможность сориентировать молодых системных и сетевых администраторов в условиях [подозрения] компрометации.

    Локальное наблюдение

    Журналы.

    Журналирование работы системы очень важно. Log-файлы являются первым источником сведений о процессах, происходивших в системе, и, конечно же, первой целью взломщика, заметающего следы проникновения. Киберпреступники всегда стараются максимально скрыть любые доказательства своей деятельности, поэтому хорошим подходом является сохранение либо дублирование журналов на отдельном ресурсе или по электронной почте. Естественно, электронный ящик, куда приходят отчеты работы системы, должен обслуживаться отдельным узлом. В этом случае, как правило, им можно верить.
    FHS предлагает директорию, в которой должны располагаться файлы регистрации. Вот небольшой список стандартных расположений журналов:
    • /var/log/acpid — служба, которая отвечает за питание (acpi для intel);
    • /var/log/boot.log — журнал загрузки системы;
    • /var/log/cron — планировка событий;
    • /var/log/messages — сообщения системы (ядра);
    • /var/log/daemon.log — сообщения сервисов;
    • /var/log/debug — отладочные системные сообщения;
    • /var/log/Xorg.*.log — графическая подсистема (X-сервер Xorg);
    • /var/log/cups/* — система печати cups (достаточно популярная и широкораспространенная);
    • /var/log/samba/* (по умолчанию) — регистрация работы сетевых дисков.

    Журналирование http-, ftp-сервера, MTA/MDA, сетевых служб уже более узкая и профессиональная тема. По понятным, надеюсь, причинам не рассматриваются в данной статье.
    Вывод команды dmesg и записи в messages, debug и daemon.log следует первым делом изучать при возникновении (общесистемных) проблем. Последние два особенно, если проблемы связаны со службами.
    Оговорюсь, что указанные пути к файлам регистрации конечно же могут отличаться в различных системах. В подобных ситуациях следует обращаться к документации дистрибутива.
    Я привел лишь некоторый список, для примера. Узнать расположение журнального файла можно из man-страниц или файлов конфигурации. Обычно это не должно вызвать затруднений. Например, куда помещать записи о работе общих сетевых папок, определяет директива log file файла конфигурации (/etc/samba/smb.conf, как правило) соответствующего демона Samba. В настройках большинства сетевых, в основном, служб можно также указать формат и, для некоторых, уровень детализации записей журналирования.

    Изменения в файлах.

    Очень хорошим инструментом для выявления факта модификации файлов является стандартная программа find. Разумное использование параметра mtime поможет установить изменения в файловой системе, например, команда
    find /etc -mtime -1

    покажет файлы, которые были изменены в течение последних суток. Очень хорошо поиск файлов по различным временам описан в Unix find tutorial.

    Процессы.

    Анализ запущенных процессов следует проводить с помощью программы top. Пример вывода:
    top - 15:21:36 up 4 days, 19:04, 2 users, load average: 0.06, 0.01, 0.00
    Tasks: 92 total, 1 running, 91 sleeping, 0 stopped, 0 zombie
    Cpu(s): 0.0%us, 0.7%sy, 0.0%ni, 97.4%id, 1.7%wa, 0.3%hi, 0.0%si, 0.0%st
    Mem: 256088k total, 249192k used, 6896k free, 5320k buffers
    Swap: 265064k total, 304k used, 264760k free, 176876k cached

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    27362 decoy 15 0 17400 11m 3616 S 0.3 4.7 3:48.28 rtorrent
    1 root 18 0 2912 1848 524 S 0.0 0.7 0:01.83 init
    ...

    Первый столбец таблицы содержит номер процесса. Он может быть использован, например, для снятия командой kill. Далее (слева направо) следует имя пользователя, инициировавшего запуск, затем приоритет задачи, некоторая служебная информация, в частности, использование приложением системных ресурсов, время, в течение которого процесс выполняется, и команда запуска.
    Кроме монитора реального времени top есть еще мощный генератор снимков процессов ps. Например, можно узнать, выполняется ли заданная программа, скажем, Midnight Commander, в данный момент или нет, командой
    ps aux | grep mc | grep -v grep

    Настоятельно рекомендуется установить htop — более приятный и наглядный для пользователя (достаточно один раз увидеть) аналог top.

    Состояние сети

    Сканер nmap.

    Колоссально мощный инструмент, для которого пишутся чуть ли не отдельные книги по использованию. Вот пример:
    $ nmap -sT -v -v -v localhost
    Starting nmap 3.55 ( www.insecure.org/nmap ) at 2005-02-04 22:01 EET
    Machine 127.0.0.1 MIGHT actually be listening on probe port 80
    Host localhost.localdomain (127.0.0.1) appears to be up ... good.
    Initiating Connect() Scan against localhost.localdomain (127.0.0.1) at 22:17
    Adding open port 111/tcp
    Adding open port 25/tcp
    Adding open port 113/tcp
    Adding open port 22/tcp
    Adding open port 80/tcp
    Adding open port 631/tcp
    The Connect() Scan took 1 second to scan 1660 ports.
    Interesting ports on localhost.localdomain (127.0.0.1):
    (The 1654 ports scanned but not shown below are in state: closed)
    PORT STATE SERVICE
    22/tcp open ssh
    25/tcp open smtp
    80/tcp open http
    111/tcp open rpcbind
    113/tcp open auth
    631/tcp open ipp

    Nmap run completed -- 1 IP address (1 host up) scanned in 0.503 seconds

    Следовательно, на моей машине запущен веб-сервер. Еще пример (проверяем узел на предмет RPC DCOM):
    # nmap -sS -p 135 xxx.xxx.xxx.xxx

    Starting nmap 3.55 ( www.insecure.org/nmap ) at 2005-02-04 22:06 EET
    Interesting ports on *.* (xxx.xxx.xxx.xxx):
    PORT STATE SERVICE
    135/tcp filtered msrpc

    Nmap run completed -- 1 IP address (1 host up) scanned in 45.798 seconds

    Замечание: некоторые типы сканирования требуют привилегий суперпользователя (root).
    Сканер nmap может проверять не только отдельные узлы, но и целые диапазоны. Как правило, не входит в «чистую» инсталляцию системы, но прост в установке и крайне рекомендован к использованию в целях аудита.
    Иногда, при подозрительных аномалиях или исходя из результатов nmap, очень полезно запустить анализатор трафика (сниффер) tcpdump, отфильтровать «неподозрительные» сетевые пакеты и посмотреть что же останется. По сути, tcpdump не является сниффером, он делает снимки, но в подобных ситуациях окажется крайне полезным.
    Еще один замечательный интсрумент, который нужно использовать — это netstat. Он применяется для получения списка активных сетевых соединений.
    $ netstat -l
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 *:32769 *:* LISTEN
    tcp 0 0 *:62978 *:* LISTEN
    tcp 0 0 *:sunrpc *:* LISTEN
    tcp 0 0 *:auth *:* LISTEN
    tcp 0 0 localhost.localdoma:ipp *:* LISTEN
    tcp 0 0 localhost.localdom:5335 *:* LISTEN
    tcp 0 0 *:29305 *:* LISTEN
    tcp 0 0 localhost.localdom:smtp *:* LISTEN

    В связке с такими инструментами Linux, как lsof и fuser, мы узнаем, какие программы используют какие порты.

    Заключение

    Я постарался сделать обзор системных мониторов для «самых маленьких». Весь описанный инструментарий можно найти практически в любой сборке Linux. Речь не идет о мощных и тяжеловесных сторонних программных комплексов IDS и оболочек для ФС.
    В заключении я хотел бы сказать, что грамотное использование самого стандартного набора инструментов позволяет проводить базовый аудит. Помните: проблема безопасности не выдумка параноиков! Многие задумываются о собственной защите после влома. «Лучший способ убедиться в том, что меры предосторожности не понадобятся — вовремя принять их», — Мерфи.

    Краткий обзор на последок...

    Анализ процессов:
    • top
    • ps

    Анализ сети:
    • nmap
    • tcpdump
    • netstat
    • fuser
    • lsof

    Анализ файловой системы:
    • find
    Поделиться публикацией

    Комментарии 88

      +1
      Я думал вы будете описывать что-то типа лендскейпа.
        –1
        Хотел спросить — как проверить существования процесса по имени/части имени.
        • НЛО прилетело и опубликовало эту надпись здесь
            +3
            ps aux | grep имя_процесса
              0
              ps aux | grep имя_процесса | grep -v grep
              иначе выдавать будет еще и греп, который ищет данный процесс
                0
                ps aux | grep [и]мя_процесса

                а вообще, более правильно использовать для этого ps -C имя_процесса, ну или awk, а то нагрепать можно много лишнего
                  0
                  еще есть вариант избавления от grep в выводе:
                  pgrep <часть имени процесса>
                    0
                    Не нужно давать малообдуманных советов

                    $ ps aux | grep mc | grep -v grep
                    non7top 6986 0.1 0.0 12284 3900 pts/1 S+ 20:23 0:02 mc

                    $ ps aux | grep mc
                    non7top 6986 0.1 0.0 12284 3900 pts/1 S+ 20:23 0:02 mc
                    non7top 8293 0.0 0.0 11856 3544 pts/4 S+ 20:51 0:00 mc grep

                      +1
                      [danial@cithadel ~]$ ps aux|grep mc
                      root 5814 0.0 0.0 50528 3488 pts/3 S+ 21:07 0:00 mc
                      danial 5822 0.0 0.0 10520 988 pts/1 S+ 21:07 0:00 grep mc
                      [danial@cithadel ~]$ ps aux|grep mc|grep -v grep
                      root 5814 0.0 0.0 50528 3488 pts/3 S+ 21:07 0:00 mc
                      Что не так?
                        0
                        разницу между 'grep mc' и 'mc grep' понимаем али нет? еще раз внимательно изучи мой предыдущий пост.
                          0
                          Куда же интересно исчез процесс самого grep?
                            +1
                            Там есть race-condition, иногда ps axu | grep foobar процес самого grep-а не показывает.
                            +1
                            И откуда получилось 'mc grep'?
                              0
                              Век живи — век учись. en.wikipedia.org/wiki/Command_line_arguments

                              ЗЫ отсутвие процесса самого grep нужно считать неумышленным недокопированием полного вывода. но там он абсолютно не важен, а важно немного другое.
                                0
                                Согласен, есть недостаток метода.
                                  0
                                  > важно немного другое
                                  Простите, что?
                                    +1
                                    для тех кто до сих пор не понял
                                    'grep -v grep' скрывает не только 'grep mc', но так же и любую другую команду где есть 'grep'. если имя пользователя будет содержать эту подстроку то вообще забавно будет. пример я уже привел.
                                      0
                                      Да, это нельзя упускать из виду. Нельзя забывать как работает фильтр, используя его, а то потом можно долго разбираться «что не так»… %)
                                        0
                                        А так не короче?
                                        ps -A | grep mc
                                        6977 pts/0 00:00:00 mc
                            0
                            Я обычно использую такую команду: ps aux | grep -i имя_процесса, если руками набирать и глазами смотреть. вариант предложенный Optik использую в скриптах.
                          0
                          Мда… Затупил, извиняюсь :)
                        +5
                        Я бы все-таки убрал из текста упоминание про «nmap localhost».
                        Гораздо разумнее воспользоваться помянутым «netstat -l», только добавить еще к нему:
                        * -A inet, чтобы выкинуть unix сокеты (а то их сильно много бывает)
                        * -p, чтобы видеть слушающий процесс (будут видны не все процессы, а только свои)
                        * -n, чтобы видеть цифири вместо буков там где порты (это по желанию)
                          0
                          Очень дельно, спасибо!
                            –1
                            Я обычно использую набор
                            netstat -ntap.
                              0
                              Будут еще и установленные соединения.
                              А их на загруженном сервере может быть много.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  +1
                                  netstat -tupan
                                  главное — легко запоминается, хотя работает только на линуксе. для юниксов нужно убрать -p
                                +3
                                для просмотра процессов, пользуюсь htop
                                  +1
                                  Да, еще с недавних пор использую atop, забыл упомянуть, правда он устанавливается отдельно, в то время, как top должен быть, пожалуй, в любой системе.
                                    0
                                    Практика показала, что в минимальном netinstall Дебиана его не было. Также там не оказалось killall и еще чего-то привычного :)
                                    0
                                    Отличная штука, лучше чем top во всех понятиях.
                                      0
                                      а на мой взгляд… htop лучший, а atop слишком сложен…
                                      +2
                                      о, спасибо за программу) Очень приятная
                                        0
                                        +1

                                        автор, добавте, плз., в статью
                                          0
                                          Добавил, спасибо, htop действительно великолепен! :)
                                      –1
                                      Нестандартные наблюдения:
                                      Кто занял порт и стал на нем слушать?
                                      На самом деле процесс httpd или замаскированный shell на perll?
                                      Какая наволочь грузит CPU на 100%?
                                      Где делась память?
                                      Кто свопит больше — httpd или mysqld?
                                      Процессы-которые-сами-себя-удаляют-после-запуска и проблемы их нахождения через lsof

                                      И прочие разные страшилки. Смотрите на лицензионных носителях сериал Сисадмины Хостенгофф тоже плачутъ. Официальный спонсор показа — Пяни. Реальне, сочне, настояще фрукте!
                                        0
                                        Кто занял порт и стал на нем слушать?
                                        netstat -nap |grep [port_number]
                                          0
                                          а там httpd, хотя это perl
                                          ку?
                                            0
                                            процесс — апач. перл это только его модуль, а значит показать его можно только встроенными в апач средствами и никак иначе. (например, используя server status)
                                              +2
                                              По-моему товарищ имел в виду нечто другое. А именно: смотрим нетстатом и видим, что на порту висит процесс httpd. Успокаиваемся и идём спать. Не подозревая о том, что на самом деле это не апач, а перл-скрипт с именем httpd, лежащий, к примеру, в хомяке. Вопрос состоит в том, как это определить.
                                            0
                                            [root@carrot stolen]# netstat -lptn
                                            Active Internet connections (only servers)
                                            Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
                                            tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
                                            tcp 0 0 0.0.0.0:42060 0.0.0.0:* LISTEN -

                                            И он не всегда признается, к сожалению.
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            «Как там дела со свободным местом»
                                            Что куда — mount.
                                              0
                                              Еще можно cat /proc/mounts
                                                0
                                                более удобно так:
                                                mount | column -t
                                                –1
                                                На каждый день? Не-не-не, вывод df-h я по крону проверяю =)
                                                +1
                                                Можно не выходя из top убить процесс, просто жмем k, а потом PID номер.
                                                  +3
                                                  Очень хорошо, что вы это описали.

                                                  Но всё же книга «Linux. Руководство системного администратора» в этом плане написана лучше. Извините за критику)

                                                  Дело в том, что начинающий системный администратор должен сначала понять принципы, на которых работает Linux.
                                                  А если использовать шаманские заклинания из двухсот букоф, которые рассказывают магические сведения — то при попытке понять, что это всё значит, волосы встанут дыбом. Так было у меня, так было у нескольких знакомых людей. Каждая новая команда вызывает культурный шок.

                                                  Поэтому изучение надо начинать с понимания «что» и «почему». Тогда все остальные вещи, типа расположения логов и мантры призыва netstat — будут очевидны и приятны. Каждая новая команда будет доставлять удовольствие, а весь процесс в целом — напоминать езду на дорогом хоошем автомобиле.
                                                    0
                                                    Абсолютно с Вами согласен! Совершенно! Только целевая аудитория, для которой я писал, не системные администраторы, а пользователи, которым приходится сталкиваться с базовыми задачами, но системно-сетевое администрирование для них не является профилирующей деятельностью. Могу привести примеры. :)
                                                      0
                                                      приведите, пожалуйста? я не троллю, правда интересно. вот зачем обычному пользователю может быть нужна команда ps в любом ее варианте?

                                                      есть такие предположения:

                                                      * этот «обычный пользователь» — уже не совсем обычный, а продвинутый. Он имеет на рабочем столе открытую консоль и знает разные умные команды.
                                                      * он не имеет возможности использовать графический режим. например, сервер очень слабый.
                                                      * управляет удаленно по SSH
                                                      * имеет какие-то умные скрипты по управлению процессами, которые написал кто-то другой.

                                                      и есть такая замена: ksysguard в графическом режиме, который заменяет эту, и еще пару десятков команд. Я настоятельно советую пользоваться ksysguard в графическом режиме — именно для этого она и писалась!

                                                      Просто если пользователю встретилась такая ошибка, что он вручную начинает отлаживать Ксорг… то через пару дней круглосуточного занятия этой познавательной задачей он рискует превратиться в нехилого такого сисадмина :)
                                                        0
                                                        Просто продвинутый пользователь, он же geek, или программист работает на портативном компьютере, а дома у него где-нибудь в кладовке стоит старая машина под многоцелевой сервер, который и файловым хранилищем и испытательным полигоном выступает. Жизнь усложняется, если эта железка видна в Сети…

                                                        Касательно конкретно ps. Довольно мощная программа, но не уверен, что нужно быть довольно продвинутым пользователем, чтобы иногда запускать консоль и что-то там набирать. Использование Linux это предполагает. Примерная ситуация была не так давно рассмотрена в блоге «Убунтариум».
                                                          0
                                                          а, ну у нас просто немного не соответствовали верхняя и нижняя планка «продвинутости».

                                                          я писал из предположения об основном пользователе Линукса, которого я поддерживаю: бухгалтерию и переводчиков. В их среде «продвинутым» считается тот, кто знает что такое «ip-адрес».

                                                          границы продвинутости приведены в соответствие.
                                                    0
                                                    Еще посоветую замечательный набор утилит sysstat.
                                                      +1
                                                      в заголовке у вас «стандРАтных». наверное имелось ввиду «стандАРтных».
                                                        +1
                                                        Oops, ничего себе, спасибо!
                                                        0
                                                        Можно еще для убийства процесса использовать pkill. Принимает имя процесса, а не его PID в качестве аргумента.
                                                        Смотреть вывод команды каждые N раз — watch.
                                                          +3
                                                          killall также по имени снимает
                                                            0
                                                            разница между pkill и killall в том, что
                                                            pkill foo убьет все что содержит в своем имени foo
                                                            а
                                                            killall foo убьет только все процессы foo
                                                            +1
                                                            Главное не скормить ему аргумент «-v» в ожидании вербозного вывода. Он по аналогии с grep-ом «-v» интерпретирует как «--invert-match».

                                                            Соответственно pkill -v foobar убъет почти все, на что у пользователя хватит прав.
                                                              +1
                                                              Сразу вспоминается, как мама в дестве говорила никогда не сидеть под рутом ;)
                                                              +1
                                                              pkill убивает процессы, имя которых соответствует отданному регекспу. То есть, «pkill it» будет убивать инит.
                                                              А убийство по точному имени — killall.
                                                                0
                                                                Не знал этого. Спасибо!
                                                              0
                                                              уважаемые а не подскажете, в top и uptime есть пункт загрузки системы: load average, в нем как я понимаю показываются процессы ждущие своего выполнения, считаются все процессы ждущие выполнения или только активные и как вообще правильно интерпретировать полученные данные?
                                                                +1
                                                                интерпертировать так: если load average превышает число процессоров, в системе есть узкие места (система перегружена).
                                                                  –1
                                                                  не обязательно узкое место может быть и в других ресурсах. надо его искать
                                                                    0
                                                                    … и в этом нам поможет dstat
                                                                    0
                                                                    все правильно, только скорее ядер, а не процессоров
                                                                    0
                                                                    цифра — это среднее число процессов, которые хотят выполняться но ждут пока проц. освободится. желательно чтобы была меньше чмсла процессоров.
                                                                    0
                                                                    А возможно ли установить слежение за изменением файла и когда это происходит отследить процесс который это делает?

                                                                    Если говорить конкретнее, на сайте очевидно сидит какой-то червь и систематически дописывает в индексные файлы всякую хрень, админы хоста морозятся как могут (
                                                                      +1
                                                                      вроде auditd умеет
                                                                        0
                                                                        В linux для этого подсистема *notify может использоваться.
                                                                        Утилиты можно поискать на inotify-tools.sourceforge.net/
                                                                        0
                                                                        Можно про netstat поподробнее?
                                                                          +2
                                                                          man netstat
                                                                          ;)
                                                                          0
                                                                          Спасибо, кое что новое узнал.

                                                                          А как узнать сколько места занимает на диске директория с поддиректориями?
                                                                            0
                                                                            du
                                                                            Например du -sh /path/to/dir/
                                                                            –2
                                                                            Спасибо, кое что новое узнал.

                                                                            А как узнать сколько места занимает на диске директория с поддиректориями?
                                                                              0
                                                                              du -sh
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                Благодарю, добавил.
                                                                                0
                                                                                Спасибо сообществу за дельные дополнения и комментарии!
                                                                                  +2
                                                                                  iostat -x 1 — понаблюдать за дисками
                                                                                  iotop (нужен свежий Python и вообще надо ставить) — понять, кто много кушает дисковой подсистемы
                                                                                  free — проверить не только память, но и свап
                                                                                  smartctl — проверить S.M.A.R.T. состояние дисков
                                                                                  dmidecode — узнать кучу интересного о железе
                                                                                  ss (нужны установленные iproute2) — аналог sockstat из BSD, иногда работает быстрее и надёжнее netstat
                                                                                  mii-tool — узнать, на каких сетевых интерфейсах есть линк
                                                                                  ethtool — узнать не только есть ли линк, но и на какой скорости и ещё кое-что
                                                                                    0
                                                                                    dstat туда же
                                                                                    0
                                                                                    показать память, процессор и многое другое с интервалом в 5 секунд
                                                                                    [alexbig@host ~]$ vmstat -S M 5
                                                                                      +2
                                                                                      обновлять вывод любой команды раз в полторы секунды:
                                                                                      watch -n 1.5 df -h
                                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                                          0
                                                                                          раз написали про cups стоит упоминуть и samba
                                                                                          в etc/samba/smb.conf обычно указывается путь к log file = /var/log/samba.log.%m

                                                                                            0
                                                                                            Да, спасибо, как-то забылось после перехода на NFS…

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

                                                                                          Самое читаемое