Первое знакомство с командой ss
В Linux есть программы, которые пригодятся программистам, специалистам по информационной безопасности, администраторам… короче говоря, каждый найдёт здесь то, что ему нужно.
Инструмент командной строки netstat был одним из тех средств, которыми часто пользовались системные администраторы. Однако команда netstat была признана устаревшей и на смену ей пришла более быстрая и удобная в использовании команда ss .

Сегодня мы поговорим о том, как применять ss для того, чтобы узнавать о том, что происходит с сетью на компьютере, работающем под управлением Linux.
О команде ss
Команда ss — это инструмент, используемый для вывода сетевой статистики в виде, похожем на тот, который выдаёт команда netstat . Однако, ss делает это проще и быстрее, чем netstat . Кроме того, ss даёт более подробные сведения о TCP-подключениях и о состояниях соединений, чем большинство других инструментов. В частности, ss может выводить данные о таких сущностях, как PACKET, TCP, UDP, DCCP, RAW, и сокеты домена Unix. Команда ss проще, чем netstat . для того, чтобы в этом убедиться, достаточно сравнить страницы man этих двух инструментов. С помощью ss можно получить весьма подробные сведения о том, как машина, работающая под управлением Linux, обменивается данными с другими компьютерами. Всё это открывает возможности по диагностике и устранению различных сетевых ошибок.
Основы ss
Команда ss работает так же, как и любые другие утилиты командной строки Linux. А именно, в командной строке вводят имя соответствующего исполняемого файла, за которым следует необходимая комбинация опций. Если взглянуть на страницу справки по ss (вызвать её можно командой man ss ), можно заметить, что тут присутствует гораздо меньше ключей командной строки, чем у netstat . Однако это не говорит о скудных возможностях ss . На самом деле, перед нами — весьма мощный инструмент.
Если запустить ss без аргументов командной строки или опций, она выведет полный список работающих соединений.

Полный список установленных соединений
Так как команда ss (без опций) показывает очень много данных (подробности по всем соединениям, установленным по TCP, UDP и с помощью сокетов Unix), можно отправить вывод этой команды в файл для того, чтобы проанализировать его позже. Делается это, например, так:
ss > ss_output
Конечно, в любых ситуациях команда в простейшем виде не так уж и полезна. Что если нужно лишь вывести список сокетов, ожидающих соединений? Сделать это просто — достаточно воспользоваться опцией -l :
ss -l
Такая команда выведет список, в котором присутствуют лишь сокеты, находящиеся в режиме прослушивания сети.
Для того чтобы ещё немного сузить диапазон выводимых этой командой данных, учитывайте то, что опция -t позволяет просматривать сведения по TCP-соединениям, опция -u предназначена для вывода данных по UDP-соединениям, опция -x выводит данные по соединениям Unix. Выглядит всё это следующим образом: ss -t , ss -u , или ss -x . Любая из этих команд выведет большой объём данных, которые можно проанализировать.

Команда ss, выполненная в Elementary OS выдаёт список UDP-соединений
По умолчанию использование опций -t , -u или -x выведет лишь данные по установленным соединениям. Если нужно отобрать соединения, ожидающие подключений, понадобится добавить к вызову команды опцию -a :
ss -t -a
В вывод этой команды попадут TCP-сокеты:

Обратите внимание на то, что последний сокет ожидает ssh-подключений
В вышеприведённом примере можно заметить, что соединения (в различных состояниях) установлены с IP-адреса анализируемого компьютера, при этом выводятся сведения по портам на этом компьютере, а также по адресам и портам на удаленных системах. В отличие от команды netstat , ss не выводит сведения о PID и имени команды, ответственной за конкретное соединение. Однако, даже учитывая это, в нашем распоряжении оказывается немало данных для поиска сетевых ошибок. Если нечто оказывается под подозрением, ss позволит узнать подробности о соединении, а значит, дать в распоряжение администратора сведения, которые пригодятся на ранних стадиях решения сетевых проблем.
Фильтрация вывода ss на основе состояний TCP
Весьма удобная возможность команды ss заключается в том, что она может фильтровать вывод, используя состояния TCP (или состояния жизненного цикла соединения). Благодаря использованию состояний облегчается фильтрация вывода ss . А именно, здесь доступны все стандартные состояния TCP:
- established
- syn-sent
- syn-recv
- fin-wait-1
- fin-wait-2
- time-wait
- closed
- close-wait
- last-ack
- listening
- closing
- all (все вышеперечисленные состояния)
- connected (все состояния, кроме ожидающих соединения и закрытых)
- synchronized (все состояния, соответствующие установленным соединениям, за исключением syn-sent )
- bucket (состояния, представляющие собой минисокеты, например — time-wait и syn-recv )
- big (всё кроме того, что соответствует идентификатору bucket )
ss -4 state FILTER
ss -6 state FILTER
В этих двух примерах FILTER представляет собой идентификатор состояния.
Предположим, нужно просмотреть все ожидающие соединения IPv4-сокеты. Сделать это поможет такая команда:
ss -4 state listening
В ответ на эту команду система выведет нечто подобное тому, что показано на следующем рисунке.

Использование ss с фильтром состояния ожидания соединения
Показ подключений с конкретных адресов
Одно из полезных применений ss заключается в том, чтобы получать с помощью этой команды сведения по соединениям, установленных с неких IP-адресов. Предположим, нужно выяснить, подключена ли машина, скажем, с IP-адресом 192.168.1.139 к нашему серверу, и если это так — узнать об этом подробности. Для решения этой задачи подойдёт такая команда:
ss dst 192.168.1.139
В ответ на эту команду будут выведены сведения, включающие в себя Netid, состояние подключения, данные по локальному IP-адресу и порту, а также по удалённому IP и порту соединения.

Удалённый компьютер установил ssh-подключение к нашей машине
Итоги
Утилита ss может очень пригодиться в делах поиска и устранения сетевых неполадок Linux-серверов. Конечно, для того, чтобы в полной мере освоить ss , неплохо будет почитать man и попрактиковаться. Однако, теперь у вас есть представление о том, как применять эту команду, которую просто необходимо знать современному администратору Linux.
Уважаемые читатели! Пользуетесь ли вы ss?

- Блог компании RUVDS.com
- Настройка Linux
- Системное администрирование
Как отслеживать подключения к сокету с помощью команды ss

Мануал
Автор cryptoparty На чтение 10 мин Опубликовано 25.05.2021
ss (socket stat) – это инструмент командной строки, который отслеживает соединения сокетов и отображает статистику сокетов системы Linux.
Она может отображать статистику для сокетов PACKET, сокетов TCP, сокетов UDP, сокетов DCCP, сокетов RAW, сокетов домена Unix и многого другого.
Она заменяет устаревшую команду netstat в последней версии Linux.
Команда ss работает намного быстрее и выводит более подробную сетевую статистику, чем команда netstat.
Если вы знакомы с командой netstat, вам будет легче понять команду ss, поскольку она использует аналогичные параметры командной строки для отображения информации о сетевых подключениях.
Перейдите по следующей ссылке, чтобы увидеть другие руководства по сетевым командам:
1) Список всех подключений сокетов
Базовая команда ss без аргументов, которая отображает все сокеты или сетевые подключения:

Понимание заголовков в выводе:
- Netid: Тип сокета. Распространенными типами являются TCP, UDP, u_str (поток Unix) и u_seq (последовательность Unix).
- State: состояние сокета. Общие состояния: ESTAB (установлено), UNCONN (отключено), LISTEN (прослушивание), CLOSE-WAIT и SYN-SENT.
- Recv-Q: количество полученных пакетов в очереди.
- Send-Q: количество отправленных пакетов в очереди.
- Local Address:Port – Адрес локальной машины и порта.
- Peer Address:Port – Адрес удаленного компьютера и порта.
Вывод по умолчанию показывает тысячи строк одновременно, и часть вывода не будет видна на терминале, поэтому используйте команду «меньше» для постраничной отчетности.
$ ss | less Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_seq ESTAB 0 0 @0000d 54585 * 54586 u_seq ESTAB 0 0 @0000e 54587 * 54588 u_seq ESTAB 0 0 @0000f 55132 * 55133 u_seq ESTAB 0 0 @00010 55134 * 55135 u_str ESTAB 0 0 * 439093 * 442955 u_str ESTAB 0 0 * 260423 * 260424 u_seq ESTAB 0 0 * 153096 * 153095 u_str ESTAB 0 0 * 57451 * 57450 u_str ESTAB 0 0 * 55382 * 49033 u_str ESTAB 0 0 * 41956 * 41957 u_seq ESTAB 0 0 * 41936 * 41935 u_str ESTAB 0 0 /run/user/1000/bus 39750 * 35633
3) Как просмотреть все прослушивающие сокеты
Отобразим только прослушивающие соединения сокетов в нашей системе Linux, для этого запустим:
$ ss -l Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port nl UNCONN 0 0 rtnl:chrome/3578 * nl UNCONN 0 0 rtnl:kernel * nl UNCONN 0 0 rtnl:chrome/3618 * nl UNCONN 0 0 rtnl:mission-control/2102 * nl UNCONN 0 0 rtnl:atom/3381 * nl UNCONN 0 0 rtnl:goa-daemon/2107 * nl UNCONN 0 0 rtnl:firefox/2979 * nl UNCONN 0 0 rtnl:evolution-calen/2207 * nl UNCONN 0 0 rtnl:nscd/1262 * nl UNCONN 0 0 rtnl:gnome-software/2229 * nl UNCONN 0 0 rtnl:avahi-daemon/1184 * nl UNCONN 0 0 rtnl:evolution-addre/2329 * nl UNCONN 0 0 rtnl:wpa_supplicant/1547 *
4) Отображение соединений сокетов TCP
Отобразим только соединения сокетов TCP в нашей системе Linux,для этого запустим:
$ ss -ta State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:38658 142.250.183.2:https ESTAB 0 0 192.168.43.4:47464 142.250.182.227:https ESTAB 0 0 192.168.43.4:40184 34.102.149.62:https ESTAB 0 0 192.168.43.4:34546 23.211.105.67:https ESTAB 0 0 192.168.43.4:41188 52.37.132.164:https ESTAB 0 0 192.168.43.4:34548 23.211.105.67:https ESTAB 0 0 192.168.43.4:57118 142.250.196.34:https ESTAB 0 0 192.168.43.4:59392 35.244.159.8:https ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh ESTAB 0 0 192.168.43.4:52680 142.250.77.34:https
4-a) Отображение соединений сокетов UDP
$ ss -ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 192.168.43.4:46312 0.0.0.0:* UNCONN 0 0 224.0.0.251:mdns 0.0.0.0:* UNCONN 0 0 224.0.0.251:mdns 0.0.0.0:* UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* UNCONN 0 0 0.0.0.0:47347 0.0.0.0:* UNCONN 0 0 192.168.43.4:56078 0.0.0.0:* ESTAB 0 0 192.168.43.4%wlan0:bootpc 192.168.43.1:bootps UNCONN 0 0 [::]:mdns [::]:* UNCONN 0 0 [2402:3a80:462:e78:e4ca:8bb:a7ae:8888]:40157 [::]:* UNCONN 0 0 [::]:48993 [::]:* UNCONN 0 0 [2402:3a80:462:e78:e4ca:8bb:a7ae:8888]:33353 [::]:* ESTAB 0 0 [2402:3a80:462:e78:e4ca:8bb:a7ae:8888]:33597 [2404:6800:4009:809::2004]:https
4-б) Отображение соединений сокетов UNIX
$ ss -xa Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str LISTEN 0 128 /run/systemd/journal/stdout 13825 * 0 u_str LISTEN 0 128 /tmp/.ICE-unix/1989 36552 * 0 u_dgr UNCONN 0 0 /run/systemd/journal/socket 13827 * 0 u_str LISTEN 0 5 /tmp/.esd-1000/socket 40072 * 0 u_str LISTEN 0 1 /tmp/.X11-unix/X0 37262 * 0 u_str LISTEN 0 128 /run/user/1000/keyring/.ssh 514311 * 0 u_str LISTEN 0 128 @/tmp/.ICE-unix/1989 36551 * 0 u_str LISTEN 0 10 /run/mcelog/mcelog-client 28958 * 0 u_str LISTEN 0 128 /var/run/nscd/socket 29728 * 0 u_str LISTEN 0 1 @/tmp/.X11-unix/X0 37261 * 0
4-в) Отображение RAW сокетов
$ ss -wa State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:ipv6-icmp *:*
5) Вывод только прослушивающих TCP-сокетных соединений
Чтобы вывести только прослушивающие соединения TCP-сокета, запустите:
$ ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 5 127.0.0.1:631 0.0.0.0:* LISTEN 0 100 127.0.0.1:25 0.0.0.0:* LISTEN 0 10 0.0.0.0:3689 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 5 [::1]:631 [::]:* LISTEN 0 100 [::1]:25 [::]:* LISTEN 0 10 [::]:3689 [::]:*
6) Список подключений сокетов IPv4 и IPv6
Чтобы отобразить только подключения к сокетам IPv4, запустите:
$ ss -4 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp ESTAB 0 0 192.168.43.4%wlan0:bootpc 192.168.43.1:bootps tcp ESTAB 0 0 192.168.43.4:41188 52.37.132.164:https tcp ESTAB 0 0 192.168.43.4:59392 35.244.159.8:https tcp ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh tcp CLOSE-WAIT 1 0 192.168.43.4:50232 35.244.247.133:https tcp ESTAB 0 0 192.168.43.4:51714 142.250.77.34:https tcp ESTAB 0 0 192.168.43.4:51724 142.250.77.34:https tcp ESTAB 0 0 192.168.43.4:56566 13.227.129.99:https tcp ESTAB 0 0 192.168.43.4:48470 142.250.183.98:https tcp ESTAB 0 0 192.168.43.4:56718 216.58.196.66:https
7) Выведем имена процессов и pidы с помощью команды ss
Чтобы перечислить имя процесса и pid, связанные с сетевыми подключениями, выполните:
Вам нужно запустить эту команду с привилегией sudo, чтобы просмотреть все имена процессов и связанные pid.
$ sudo ss -ltp [sudo] password for root: State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=1338,fd=3)) LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:* users:(("cupsd",pid=1260,fd=7)) LISTEN 0 100 127.0.0.1:smtp 0.0.0.0:* users:(("master",pid=1630,fd=13)) LISTEN 0 10 0.0.0.0:daap 0.0.0.0:* users:(("rhythmbox",pid=16209,fd=18)) LISTEN 0 128 [::]:ssh [::]:* users:(("sshd",pid=1338,fd=4)) LISTEN 0 5 [::1]:ipp [::]:* users:(("cupsd",pid=1260,fd=6)) LISTEN 0 100 [::1]:smtp [::]:* users:(("master",pid=1630,fd=14)) LISTEN 0 10 [::]:daap [::]:* users:(("rhythmbox",pid=16209,fd=19))
8) Показать информацию о таймере подключений сокетов
Чтобы показать, как долго “живет” соединение сокета, запустите:
$ ss -tn -o State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:41188 52.37.132.164:443 timer:(keepalive,9min54sec,0) ESTAB 0 0 192.168.43.4:59392 35.244.159.8:443 ESTAB 0 0 192.168.43.4:50678 103.43.90.19:443 timer:(keepalive,9.512ms,0) ESTAB 0 0 192.168.43.4:49948 94.237.76.92:22 timer:(keepalive,38min,0) ESTAB 0 0 192.168.43.4:36528 182.161.72.130:443 ESTAB 0 0 192.168.43.4:48704 142.250.192.66:443 ESTAB 0 0 192.168.43.4:38544 103.43.89.4:443 timer:(keepalive,8sec,0) ESTAB 0 517 192.168.43.4:57978 182.161.72.137:443 timer:(on,288ms,0)
9) Как вывести сводную статистику
Чтобы просмотреть общую сводку всех подключений к сокетам, запустите:
$ ss -s Total: 1278 TCP: 35 (estab 10, closed 11, orphaned 0, timewait 2) Transport Total IP IPv6 RAW 1 0 1 UDP 11 7 4 TCP 24 13 11 INET 36 20 16 FRAG 0 0 0
Команда выведет результаты в табличном формате, включая количество подключений к сокетам TCP и UDP, IPv4 и IPv6.
10) Просмотр расширенного вывода соединений сокетов
Чтобы просмотреть расширенный вывод подключений сокетов, выполните:
$ ss -lte State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* ino:27515 sk:4dc LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:* ino:30778 sk:4dd LISTEN 0 100 127.0.0.1:smtp 0.0.0.0:* ino:34118 sk:4de LISTEN 0 10 0.0.0.0:daap 0.0.0.0:* uid:1000 ino:442177 sk:586 LISTEN 0 128 [::]:ssh [::]:* ino:27517 sk:4f3 v6only:1 LISTEN 0 5 [::1]:ipp [::]:* ino:30777 sk:4f4 v6only:1 LISTEN 0 100 [::1]:smtp [::]:* ino:34119 sk:4f5 v6only:1 LISTEN 0 10 [::]:daap [::]:* uid:1000 ino:442178 sk:587 v6only:1
Расширенный вывод будет отображать uid сокета и номер inode сокета.
11) Отображение использования памяти сокетными соединениями
Чтобы узнать, сколько памяти занято сокетным подключением, запустите:
$ ss -ltm State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 100 127.0.0.1:smtp 0.0.0.0:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 10 0.0.0.0:daap 0.0.0.0:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 128 [::]:ssh [::]:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 5 [::1]:ipp [::]:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 100 [::1]:smtp [::]:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0) LISTEN 0 10 [::]:daap [::]:* skmem:(r0,rb131072,t0,tb16384,f0,w0,o0,bl0,d0)
12) Отфильтрумсоединения с помощью команды ss
Команда ss обеспечивает расширенную фильтрацию, которую можно использовать для фильтрации определенных соединений, статистики, порта, адреса или службы и т. д.
12-a) Фильтрация соединений сокетов по состоянию
Syntax: ss [option] [state] [name of the socet state]
Чтобы отобразить все сокеты tcp, которые находятся в состоянии «linstening», запустите:
$ ss -lt state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.43.4:39008 142.250.192.2:https 0 0 192.168.43.4:41188 52.37.132.164:https 0 0 192.168.43.4:59392 35.244.159.8:https 0 0 192.168.43.4:49948 94.237.76.92:ssh 0 0 192.168.43.4:48704 142.250.192.66:https 0 0 192.168.43.4:51714 142.250.77.34:https
Другое общее состояние может быть:
- closed
- syn-sent
- syn-recv
- fin-wait-1
- time-wait
- close-wait
- connected
- synchronized
12-б) Фильтрация соединений сокетов по номеру порта
Syntax: ss [option] dport = :[port number] ss [option] sport = :[port number] ss [option] '( dport = :[port number] or sport = :[port number] )'
Чтобы отфильтровать сокеты по номеру порта, запустите показанные ниже примеры.
Например, чтобы отфильтровать службу ssh, вы можете при необходимости выполнить следующие команды.
$ ss -at dport = :22 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh
$ ss -lt sport = :22 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 128 [::]:ssh [::]:*
$ ss -at dst :22 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh
$ ss -at src :22 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 128 [::]:ssh [::]:*
$ ss -at '( dport = :22 or sport = :22 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh LISTEN 0 128 [::]:ssh [::]:*
Чтобы отфильтровать сразу несколько портов, запустите:
$ ss -nt '( dst :443 or dst :22 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:41188 52.37.132.164:443 ESTAB 0 0 192.168.43.4:44970 103.43.90.20:443 ESTAB 0 0 192.168.43.4:59392 35.244.159.8:443 ESTAB 0 0 192.168.43.4:43254 34.95.69.49:443 SYN-SENT 0 1 192.168.43.4:58884 182.161.72.137:443 ESTAB 0 0 192.168.43.4:49948 94.237.76.92:22 CLOSE-WAIT 1 0 192.168.43.4:50232 35.244.247.133:443
12-c) Фильтрация соединений сокетов по имени службы
Точно так же вы можете фильтровать соединения сокетов на основе имени службы!
$ ss -at dport = :ssh State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh
$ ss -lt sport = :ssh State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 128 [::]:ssh [::]:*
$ ss -at dst :https State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:45084 103.43.90.20:https ESTAB 0 0 192.168.43.4:45076 103.43.90.20:https ESTAB 0 0 192.168.43.4:41188 52.37.132.164:https ESTAB 0 0 192.168.43.4:59392 35.244.159.8:https ESTAB 0 0 192.168.43.4:43254 34.95.69.49:https
$ ss -at src :ssh State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 128 [::]:ssh [::]:*
$ ss -at '( dport = :ssh or sport = :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh LISTEN 0 128 [::]:ssh [::]:*
$ ss -at '( dst :https or dst :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:41188 52.37.132.164:https ESTAB 0 0 192.168.43.4:59392 35.244.159.8:https ESTAB 0 0 192.168.43.4:49948 94.237.76.92:ssh CLOSE-WAIT 1 0 192.168.43.4:50232 35.244.247.133:https ESTAB 0 0 192.168.43.4:51714 142.250.77.34:https
$ ss -at '( dst :https or src :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* ESTAB 0 0 192.168.43.4:41188 52.37.132.164:https ESTAB 0 0 192.168.43.4:59392 35.244.159.8:https CLOSE-WAIT 1 0 192.168.43.4:50232 35.244.247.133:https ESTAB 0 0 192.168.43.4:51714 142.250.77.34:https
$ ss -at '( src :smtp or src :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 100 127.0.0.1:smtp 0.0.0.0:* LISTEN 0 128 [::]:ssh [::]:* LISTEN 0 100 [::1]:smtp [::]:*
12-г) Фильтрация сокетов по IP-адресу
Чтобы вывести список подключений к определенному IP-адресу назначения, запустите:
Syntax: ss [option] dst [IP Address]
Например, чтобы просмотреть список подключений, установленных к определенному IP-адресу, запустите:
$ ss -at dst 192.168.43.40 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.43.4:49948 192.168.43.40:ssh
Если вы хотите изучить другие параметры, недоступные в этом руководстве, посетите страницу руководства по команде ss.
$ man ss или $ ss --help
Заключение
В этом руководстве мы показали вам, как использовать команду ss в Linux, на нескольких примерах, включая различные параметры фильтрации.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии!
Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий Отменить ответ

Поддержать нас
- Аудит ИБ (49)
- Вакансии (12)
- Закрытие уязвимостей (110)
- Книги (27)
- Мануал (2 359)
- Медиа (66)
- Мероприятия (39)
- Мошенники (23)
- Обзоры (831)
- Обход запретов (34)
- Опросы (3)
- Скрипты (116)
- Статьи (360)
- Философия (124)
- Юмор (18)
Наш Telegram

Социальные сети
Поделиться
Anything in here will be replaced on browsers that support the canvas element
- Каковы различные форматы сертификатов? 27.10.2023
Цифровые сертификаты могут использоваться для различных целей. Они могут использоваться для защиты соединений с веб-сайтами, для шифрования сообщений электронной почты или для проверки личности пользователя. Выбор правильного формата сертификата необходим для обеспечения безопасности и сохранности данных. Когда речь идет о различных форматах сертификатов, важно выбрать тот, который соответствует вашим потребностям Выберите формат сертификата, совместимый с […]
Преобразование файла PFX (PKCS #12) в формат PEM (Privacy Enhanced Mail) достаточно просто на Linux и Unix-подобных системах. В этой статье мы рассмотрим, как преобразовать файл сертификата в формате PFX в файл PEM с помощью OpenSSL из командной строки. Что такое файл PFX? PFX (также PKCS#12) – это формат файла, содержащего сертификат(ы) и закрытый(ые) ключ(ы), […]
Одним из основных нововведений, появившихся в Podman, стала возможность запуска контейнеров без прав root. С точки зрения безопасности это было существенным улучшением, поскольку потенциально скомпрометированный контейнер, запущенный от имени root, представляет собой угрозу безопасности для хост-системы. Чтобы добиться аналогичного поведения, последние версии Docker поддерживают запуск демона docker в пользовательском контексте. Почему процессы в контейнерах […]
Small Form Factor Pluggable (SFP) – это компактный приёмопередатчик, который устанавливается в SFP порт коммутатора Ethernet. Модуль используется для присоединения платы сетевого устройства к оптическому волокну или витой паре. Модули SFP заменили устаревшие модули GBIC благодаря своим миниатюрным размерам. Это преимущество в размерах позволяет им эффективно работать в ограниченных сетевых средах, обеспечивая быстрый обмен данными […]
Давайте поговорим о классификации вредоносных программ. Когда антивирусная программа или средство защиты от вредоносного ПО обнаруживает что-то потенциально вредоносное, она использует определенный формат, чтобы помочь вам или другим специалистам понять, с какой именно угрозой вы имеете дело. Формат может выглядеть примерно так: Type:Platform/Family.Variant!Suffixes Это не всегда будет выглядеть именно так, поскольку, как вы помните, не […]
Почему в state присутствует только unconn
# Инструкция к Практической работе_14 «Список задач по усилению безопасности сервера Linux, которые необходимо сделать.» ### 1. Шифрование передачи данных для сервера Linux **Передача данных через sftp:** Так как SFTP работает поверх SSH, первым делом необходимо установить OpenSSH как со стороны сервера (хранилища): «`html $ sudo apt install openssh-server «` Также необходимо установить ssh на стороне клиента (устройства, с которого планируется доступ к хранилищу): «`html $ sudo apt install ssh «` Для безопасного использования SFTP, лучше всего создать группы и пользователей, которые будут использовать только эту службу: «`html $ sudo useradd -g sftpgroup sftpuser $ sudo passwd sftpuser «` Cоздадим каталоги и изменим их доступ: «`html $ sudo mkdir -p /data/sftpuser/upload $ chown -R root.sftpgroup /data/sftpuser $ chown -R sftpuser.sftpgroup /data/sftpuser/upload «` *Важно: убедитесь, что владелец /data/sftpuser — root, это обязательно для изменения корневого каталога в SFTP.* Далее нужно настроить сервер так, чтобы когда пользователь, из группы **sftpgroup**, входил в систему, он попадал в **sftp** вместо обычной оболочки, в которую попадает через **ssh**. Для этого нужно добавьте фрагмент кода в файл /etc/ssh/sshd_config. Для редактирования файлов в Linux существует текстовый редактор nano. Чтобы воспользоваться им достаточно выполнить команду nano “путь к файлу”: «`html $ nano /etc/ssh/sshd_config «` Добавляем следующее: «`html Match Group sftpgroup ChrootDirectory /data/%u ForceCommand internal-sftp «` ChrootDirectory позволяет создать необходимый каталог в качестве корневого узла (/ каталог) в дереве каталогов. Вошедший в систему пользователь не сможет увидеть ничего выше этого каталога и это не даст ему получить доступ к файлам других пользователей. %u — это код для заполнения текущим именем пользователя во время входа в систему. Для сохранения файла нажимаем ctrl + O, и выходим из редактора с помощью ctrl + X. Чтобы выполнить внесенные в sshd_config изменения, перезапустите службу: «`html $ sudo systemctl restart sshd «` Доступ по sftp осуществляется аналогично с ssh → **sftp username@host** (чтобы узнать ip-адрес хоста выполните команду **ip a**) : «`html $ sftp sftpuser@192.168.183.128 «` После успшеного подключения при необходимости загрузки файлов с удаленного хоста мы можем воспользоваться следующей командой для выполнения этой задачи: `sftp> get FileName` По умолчанию команда get загружает удаленный файл и сохраняет файл с тем же именем в локальной файловой системе. Мы можем указать имя, с которым сохранится файл, добавив его в вышеуказанную команду: `sftp> get FileName NewName` Команда `get` также имеет несколько флагов. Например, мы можем скопировать каталог и все его содержимое с помощью рекурсивной опции: `sgtp> get -r DirectoryName` Передача файлов в удаленную систему осуществляется таким же удобным образом с помощью команды с именем «put»: `sftp> put FileName` Директории передаются аналогичным с получением образом: `sgtp> put -r DirectoryName` Одним из хорошо знакомых инструментов, который может быть полезен при скачивании и загрузке файлов, является команда `df`, которая работает схожим образом с используемой в командной строке версией данной инструкции. Она позволяет убедиться, что у вас в распоряжении есть достаточное количество места для передачи данных, которые вас интересуют: `sftp> df -h` Вывод команды: «` Output Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4% «` Обратите внимание, что локального варианта этой команды нет, но мы можем обойти это ограничение, воспользовавшись `!` в качестве команды. Команда `!` перемещает нас в локальную оболочку, где можно запустить любую команду в локальной системе. Выполнив её, мы можем проверить использование диска также с помощью `df -h`. Чтобы вернуться в сеанс SFTP, введите `exit` . Для удаления файлов в удаленной системе используется команда **rm**: `sftp> rm FileName` ### 2. Избегайте использования служб FTP, Telnet и Rlogin / Rsh в Linux Удаляем устаревшие и небезопасные службы:  ### 3. Минимизация программного обеспечения для минимизации уязвимостей в Linux `# dpkg —list`  Удалим, к примеру, демон сбора логов rsyslog: «` rc rsyslog 8.2102.0-2+deb11u1 amd64 reliable system and kernel logging daemon «` «` root@debian:/# apt-get autoremove rsyslog Reading package lists. Done Building dependency tree. Done Reading state information. Done Package ‘rsyslog’ is not installed, so not removed The following packages will be REMOVED: linux-image-5.10.0-15-amd64 0 upgraded, 0 newly installed, 1 to remove and 4 not upgraded. After this operation, 302 MB disk space will be freed. Do you want to continue? [Y/n] y «` ### 4. Одна сетевая служба на систему или экземпляр виртуальной машины К примеру, на одной машине будет крутиться apache:  На другой сервер сбора логов:  ### 5. Поддерживайте ядро и программное обеспечение Linux в актуальном состоянии Устанавливаем обновления:  Настраиваем автоматическое обновление:  ### 6. Используйте расширения безопасности Linux > см. пункт 7 (SELinux) ### 7. SELinux Установим SELinux в Debian: «` root@debian:/# apt-get install selinux-basics selinux-policy-default «` Перейдем в конфигурационный файл: «` root@debian:/# nano /etc/selinux/config «` Нам необходимо изменить значение параметра SELINUX. Он может принимать следующие значения: «` enforcing — SELinux включен. permissive — SELinux лишь отправляет предупреждения. disabled — SELinux выключен. «` Устанавливаем значение `enforcing` ### 8. Учетные записи пользователей Linux и строгая политика паролей Установим утилиту pam-cracklib «` root@debian:/# sudo apt-get install libpam-cracklib «` Перейдем в конфигурационный файл: «` sudo nano /etc/pam.d/common-password «` Найдем там такую строчку: «` password requisite pam_cracklib.so retry=3 minlen=8 difok=3 «` И изменим её следующим образом: «` password requisite pam_cracklib.so retry=3 minlen=16 difok=3 ucredit=-1 lcredit=-2 ocredit=-2 «` Где: retry=3 : попыток до вывода ошибки minlen=16 : минимальная длина пароля difok=3 : количество символов, на которое должен отличаться новый пароль от предыдущего ucredit=-1 : как минимум один символ — в верхнем регистре lcredit=-2 : как минимум два символа — в нижнем регистре ocredit=-2 : как минимум два символа ### 9. Настройка смены паролей для пользователей Linux для повышения безопасности Пример настройки правил для учетной записи польователя user:  ### 10. Ограничение использования прежних паролей в Linux Открываем файл : «` root@debian:/# nano /etc/pam.d/common-password «` Добавляем туда следующие строчки чтобы пользователи не могли повторно использовать четыре недавно использованных пароля (значение параметра remember = 4) : «` auth sufficient pam_unix.so likeauthnullok password sufficient pam_unix.so remember=4 «` ### 11. Блокировка учетных записей пользователей после неудачного входа в систему Faillog отображает все неудачные попытки входа пользователя. Если неудачных попыток слишком много, то учетную запись можно отключить с помощью faillog. Faillog использует этот файл (/var/log/faillog) для отображения неудачных входов в систему. Faillog введенный сам по себе выводит все неудачные попытки пользователя. После неудачного входа пользователь может быть заблокирован на указанное время с опцией -l. Чтобы заблокировать учетную запись (user2) на 1 минуту (60 секунд), используйте следующее: `# faillog -l 60 -u user2` «` # faillog Login Failures Maximum Latest On user2 2 0 06/28/22 15:28:32 +0530 tty1 [51s left] «` Как видите, в последнем столбце отображается оставшееся время с момента неудачного входа в систему. Параметр -u используется для указания имени пользователя (чья учетная запись должна быть заблокирована). Кроме того, с помощью параметра -m можно установить максимальное количество попыток входа в систему. `# faillog -m 0 -u user2` Эта команда отключит учетную запись после 3 неудачных входов в систему. ### 12. Как проверить, что ни одна учетная запись не имеет пустых паролей? Создадим пользователя с пустым паролем: «` useradd usernopswd «` Теперь выведем список пользователей без пароля: «` root@debian:/# awk -F: ‘($2 == «») ‘ /etc/shadow usernopswd::19193:0:99999:7. «` Заблокируем эту учетную запись: «` root@debian:/# passwd -l usernopswd «` Откроем файл /etc/shadow и убедимся что учетная запись usernopswd заблокирована (второе поле содержит значение !) `usernopswd. 19193:0:99999:7. ` ### 13. Убедитесь, что ни одна не корневая учетная запись не имеет UID, установленного на 0.  ### 14. Отключить вход под пользователем root Прежде всего создадим пользователя с правами суперпользователя: «` root@debian:/# sudo useradd -m admin root@debian:/# passwd admin New password: Retype new password: passwd: password updated successfully root@debian:/# sudo usermod -aG sudo admin «` Зайдем в новую учетку: «` root@debian:/# su admin «` И изменим в файле: «` $ sudo nano /etc/passwd «` Следующую строчку: «` #было: root:x:0:0:root:/root:/bin/bash #стало: root:x:0:0:root:/root:/sbin/nologin «` Теперь попробуем войти в root: «` $ su Password: This account is currently not available. «` ### 15. Безопасность физических серверов Настроим вход в меню BIOS по паролю. Для этого зайдем в BIOS, перейдем во вкладку Security и установим пароль (если пароль уже установлен, нужно будет ввести сначала его):  Теперь установим значение Password on boot = enabled:  Теперь, перезагрузив систему и войдя в BIOS, система попросит нас ввести пароль:  ### 16. Отключите ненужные службы Linux Просмотрим службы и их статус:  Выключим из автозагрузки службу сбора логов rsyslog и проверим её статус: «` root@debian:/# systemctl disable rsyslog Synchronizing state of rsyslog.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable rsyslog Unit /etc/systemd/system/rsyslog.service is masked, ignoring. root@debian:/# systemctl status rsyslog ● rsyslog.service Loaded: masked (Reason: Unit rsyslog.service is masked.) Active: inactive (dead) «` ### 17. Поиск прослушиваемых сетевых портов Просмотрим порты командой `netstat`: «` root@debian:/# netstat -ltupan Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 591/cupsd tcp6 0 0 ::1:631 . * LISTEN 591/cupsd udp 0 0 0.0.0.0:5353 0.0.0.0:* 518/avahi-daemon: r udp 0 0 0.0.0.0:60653 0.0.0.0:* 518/avahi-daemon: r udp 0 0 0.0.0.0:631 0.0.0.0:* 615/cups-browsed udp 0 0 192.168.183.221:68 192.168.183.254:67 ESTABLISHED 522/NetworkManager udp6 0 0 . 5353 . * 518/avahi-daemon: r udp6 0 0 . 46661 . * 518/avahi-daemon: r «` Флаг `-l` велит netstat показать все прослушивающие сокеты (сочетания IP-адреса и порта). Тогда как флаг `-t` указывает, что нужно показать все TCP-соединения сетевой подсистемы. Конечно же, флаг `-u `демонстрирует UDP-соединения. Тогда как флаг `-a` отобразит активные соединения. В то время как флаг `-p` запрашивает данные о программном обеспечении, занимающемся прослушкой портов. Вместо имен служб бывает удобнее видеть числовые значения номеров портов. Это может сделать дополнительный флаг `-n`. Теперь сделаем тоже самое командой `ss`: «` root@debian:/# ss -ltupan Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 0.0.0.0:5353 0.0.0.0:* users:((«avahi-daemon»,pid=518,fd=12)) udp UNCONN 0 0 0.0.0.0:60653 0.0.0.0:* users:((«avahi-daemon»,pid=518,fd=14)) udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* users:((«cups-browsed»,pid=615,fd=7)) udp ESTAB 0 0 192.168.183.221%ens33:68 192.168.183.254:67 users:((«NetworkManager»,pid=522,fd=23)) udp UNCONN 0 0 [::]:5353 [::]:* users:((«avahi-daemon»,pid=518,fd=13)) udp UNCONN 0 0 [::]:46661 [::]:* users:((«avahi-daemon»,pid=518,fd=15)) tcp LISTEN 0 128 127.0.0.1:631 0.0.0.0:* users:((«cupsd»,pid=591,fd=7)) tcp LISTEN 0 128 [::1]:631 [::]:* users:((«cupsd»,pid=591,fd=6)) «` ### 18. Удаление систем X Window (X11) Удалим графическую оболочку, в случае Debian Это будет GNOME: «` root@debian:/# sudo apt-get autoremove gnome* «` И перезапустим систему: «` root@debian:/# sudo reboot «` Теперь она будет выглядить так:  > Рекомендую сделать бэкап системы перед выполнением подобных действий ### 19. Настройка брандмауэра на основе Iptables и TCPWrappers в Linux iptables — это утилита командной строки, используемая для управления встроенным брандмауэром netfilter, доступным в ядре Linux, начиная с версии 2.4. Брандмауэр — это узел сети, на котором происходит фильтрация сетевого трафика на основе заданных администратором правил. Обеспечить безопасность сервера или инфраструктуры, означает обеспечить отказоустойчивость и стабильность работы ваших серверов и приложений, что крайне чувствительно для бизнеса или персональных проектов. В глобальной сети огромное количество угроз — боты, периодически прощупывают стандартные точки входа в системы, хулиганы, любопытные, взломщики — люди, целенаправленно пытающиеся получить несанкционированный доступ к информационным системам. Задача iptables — исключить, либо, по крайней мере, минимизировать негативное воздействие со стороны разного рода правонарушителей. Любой, поступивший пакет на сервер с iptables, проходит через ядро, а именно межсетевой экран netfilter. Каждый из них классифицируется в зависимости от его назначения, попадает в соответствующую ему таблицу и проходит по цепочкам, содержащим правила, установленные администратором. На основе этих правил, выполняется действие — принять пакет, отбросить, удалить или передать следующему узлу сети. Иллюстрация, представленная ниже, наглядно показывает путь прохождения пакета по системе:  Данный рисунок не отражает истинную архитектуру брандмауэра, а показывает только логику работы. Существует много распространенных заблуждений по поводу уровней вложенности таблиц, цепочек, и правил. Самым верхним уровнем представления являются таблицы, которые содержат набор свойственных им цепочек. Цепочки содержат списки правил. Схематично «матрешка» выглядит следующим образом:  **Синтаксис iptables** Сетевой экран iptables очень гибок в настройке и имеет огромное количество разнообразных ключей и опций. Общий вид управляющей команды: `iptables таблица команда цепочка критерии действие` Рассмотрим каждый элемент в отдельности. **Пакет** Под пакетом понимают структурированный блок данных, содержащий в себе как пользовательскую информацию, называемую ещё полезной нагрузкой, так и служебную информацию, например об адресе отправителя, получателя, времени жизни пакета и многое другое. **Цепочки** Существует 5 видов цепочек: * `PREROUTING` — предназначена для первичной обработки входящих пакетов, адресованных как непосредственно серверу, так и другим узлам сети. Сюда попадает абсолютно весь входящий трафик для дальнейшего анализа. * `INPUT` — для входящих пакетов, отправленных непосредственно этому серверу. * `FORWARD` — для проходящих пакетов, не адресованных этому компьютеру, предназначены для передачи следующему узлу, в случае, если сервер выполняет роль маршрутизатора. * `OUTPUT` — для пакетов, отправленных с этого сервера. * `POSTROUTING` — здесь оказываются пакеты, предназначенные для передачи на другие узлы сети. Также есть возможность создавать и удалять собственные цепочки, в большинстве случаев, в этом нет необходимости. Названия цепочек пишут заглавными буквами. **Таблицы** В netfilter существуют 5 типов таблиц, каждая из них имеет свое назначение. * Таблица `raw`. Содержит цепочки PREROUTING и OUTPUT, здесь производятся манипуляции с пакетами до задействования механизма определения состояний. * Таблица `mangle`. Предназначена для модификации заголовков сетевых пакетов, таких параметров как ToS (Type of Service), TTL (Time To Live), MARK. Содержит все существующие пять цепочек. * Таблица `nat`. Используется для трансляции сетевых адресов, т.е. подмены адреса получателя/отправителя, применяется, если сервер используется в качестве маршрутизатора. Содержит цепочки PREROUTING, OUTPUT, POSTROUTING. * Таблица `filter`. Основная таблица, служит для фильтрации пакетов, именно здесь происходит принятие решений о разрешении или запрете дальнейшего движения пакета в системе. Используется по умолчанию, если явно не указано имя другой таблицы. Содержит цепочки INPUT, FORWARD и OUTPUT. * Таблица `security`. Используется для взаимодействия с внешними системами безопасности, в частности с SELinux и AppArmor. Содержит цепочки INPUT, OUTPUT и FORWARD. Имена таблиц принято писать строчными буквами. **** **Действия** Правилами задается поведение для iptables, каким образом поступить с тем или иным пакетом при попадании под заданные критерии. Решения, которые принимает брандмауэр, называют действиями, самые распространенные из них: * ACCEPT — разрешить дальнейшее прохождение пакета по системе; * DROP — выбросить пакет без уведомления отправителя; * REJECT — отказать в прохождении пакета с уведомлением отправителя, такой способ может привести к дополнительным затратам ресурсов процессора, поэтому, в большинстве случаев рекомендуется использовать DROP; * LOG — зафиксировать информацию о пакете в файле системного журнала; * MARK — позволяет помечать определенные пакеты, например для маршрутизации, данная метка перестает существовать, как только пакет покинет брандмауэр; * CONNMARK — то же самое, что и MARK, только для соединений; * QUEUE — отправляет пакет в очередь приложению для дальнейшего взаимодействия; * RETURN — прекращение движения пакета по текущей цепочке и возврат в предыдущую цепочку. Если текущая цепочка единственная — к пакету будет применено действие по умолчанию; * REDIRECT — перенаправляет пакет на указанный порт, в пределах этого же узла, применяется для реализации «прозрачного» прокси; * DNAT — подменяет адрес получателя в заголовке IP-пакета, основное применение — предоставление доступа к сервисам снаружи, находящимся внутри сети; * SNAT — служит для преобразования сетевых адресов, применимо, когда за сервером находятся машины, которым необходимо предоставить доступ в Интернет, при этом от провайдера имеется статический IP-адрес; * MASQUERADE — то же, что и SNAT, но главное отличие в том, что может использоваться, когда провайдер предоставляет динамический адрес, создаёт дополнительную нагрузку на систему по сравнению с SNAT; * TOS — позволяет управлять битами в одноименном поле заголовка IP-пакета; * ULOG — более продвинутый вариант записи информации, может писать как в обычный текстовый файл, так и в базу данных; * TTL — используется для изменения значения поля одноименного заголовка IP-пакета, устанавливает время жизни пакета. **Команды** Для iptables команда — это инструкция к действию, при помощи них можно добавлять, удалять и сбрасывать все правила, задавать действия по умолчанию и многое другое. Команды могут подаваться как в сокращенном, так и в полном виде: —`Полный вид; -Сокращенный вид;` Описание * —`append; -A;` добавить правило в конец указанной цепочки * —`check; -C;` проверить существующие правила в заданной цепочке * —`delete; -D;` удалить правило с указанным номером в заданной цепочке * —`insert; -I;` вставить правило с заданным номером, без указания номера — правило будет по умолчанию добавлено первым * —`replace; -R;` заменить правило с указанным номером * —`list; -L;` вывести список всех действующих правил со всех цепочек, если указать интересующую цепочку — вывод будет сделан только по ней * —`list-rules; -S;` построчный вывод всех правил во всех цепочках, если после ключа указать имя цепочки — будут выведены только ее правила * —`flush; -F;` удалить все правила, при указании имени цепочки — правила удаляться только в ней * —`zero; -Z;` обнулить все счетчики во всех цепочках, при указании цепочки — обнуление произойдет только в ней * —`new; -N;` создать пользовательскую цепочку * —`delete-chain; -X;` удалить пользовательскую цепочку * —`policy; -P;` установить политику по умолчанию для цепочки, обычно это ACCEPT или DROP, она будет применена к пакетам, не попавшим ни под один критерий * —`rename-chain; -E;` переименовать цепочку, сначала указывается текущее имя, через пробел — новое * —`help; -h;` вывести справочную информацию по синтаксису iptables **Критерии** Чтобы к пакету применить какое-либо действие, необходимо, чтобы он попал под определенные критерии. Одно правило может содержать несколько критериев. Они, как и команды, имеют полную и сокращенную форму. Некоторые из них поддерживают логическую НЕ, если перед ними поставить знак ! — критерий будет инвертирован. Список ниже: —`Полный вид; -Сокращенный вид;` Описание * —`protocol; -p;` указывает протокол, такие как tcp, udp, udplite и другие, поддерживаемые системой, ознакомиться со списком можно в файле /etc/protocols * —`source; -s;` указывает адрес источника пакета, в качестве значения можно указать как один IP-адрес, так и диапазон * —`destination; -d;` адрес получателя, синтаксис аналогичен предыдущему пункту * —`match; -m;` подключает указанный модуль * —`jump; -j;` когда правило подошло — выполнить указанное действие * —`goto; -g;` перейти к указанной цепочке правил * —`in-interface; -i;` задает входящий сетевой интерфейс * —`out-interface; -o;` указывает исходящий сетевой интерфейс * —`fragment; -f;` указывает на фрагменты фрагментированных пакетов * —`set-counters; -c;` устанавливает начальные значения счетчиков пакетов и байт * —`destination-port; —dport;` порт получателя пакета * —`source-port; —sport;` порт отправителя пакета **Состояние соединений** Система отслеживания состояния соединений `conntrack` — важная часть сетевого стека linux, встроенная в ядро. Используется для сопоставления пакетов с конкретными соединениями. Под анализ попадают все пакеты, кроме помеченных NOTRACK, в таблице raw. Все пакеты классифицируются на: * NEW — открывается новое соединение, пришел только первый пакет; * ESTABLISHED — соединение установлено, пришел уже не первый пакет в рамках этого сеанса. При правильной настройке iptables — такие пакеты проходят по системе без фильтрации, поскольку она уже была выполнена для первого пакета соединения; * RELATED — открывается новое соединение, связанное с другим сеансом, имеющим статус ESTABLISHED; * INVALID — помечаются пакеты, которые не связаны ни с одним из существующих соединений, и не могут создать новое, их невозможно идентифицировать. В целях безопасности рекомендуется остановить движение таких пакетов по системе, используя действие DROP. **Настройка** Перейдем к настройке iptables. Заблокировать входящий трафик с ip-адресом отправителя `192.168.10.20` можно следующей командой «` root@debian:/# sudo iptables -A INPUT -s 192.168.10.20 -j DROP «` Посмотреть установленные правила можно с помощью следующей команды: «` root@debian:/# sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all — 192.168.10.20 anywhere . «` Из вывода видно,что в цепочке правил INPUT к трафику, по любому протоколу (prot — all) идущему в любом направлении (destination — anywhere), чей источник (source) принадлежит указанному ip-адресу, применяется действие DROP. Чтобы разрешить трафик с определенного адреса применяется аналогичная блокирующей команда: «` root@debian:/# sudo iptables -A INPUT -s 192.168.10.20 -j ACCEPT «` Теперь при просмотер правил мы увидим два противоречащих друг другу правила. Давайте очистим их. Для этого применяется следующая команда: «` root@debian:/# sudo iptables -F «` Также вы можете указать цепочку, если очистить правила нужно только для неё, например: «` root@debian:/# sudo iptables -F INPUT «` Если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -P: «` root@debian:/# sudo iptables -P FORWARD DROP «` Или, к примеру, можно заблокировать все входящие соединения по ssh: `root@debian:/# sudo iptables -A INPUT -p tcp —dport ssh -j DROP` **Сохранение правил** Все настройки iptables, которые вы указали с помощью этих команд сохранятся только до перезагрузки. После перезагрузки компьютера все изменения будут стерты. Поэтому чтобы сохранить правила iptables, нужно выполнить специальную команду. В Debian она будет выглядеть так: «` root@debian:/# sudo /sbin/iptables-save # Generated by iptables-save v1.8.7 on Mon Jul 25 07:47:20 2022 *filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -p tcp -m tcp —dport 22 -j DROP COMMIT # Completed on Mon Jul 25 07:47:20 2022 «` ### 20. Усиление ядра Linux /etc/sysctl.conf Sysctl — это мощная команда Linux, которая действует как интерфейс для динамического изменения параметров ядра. С помощью этой команды вы можете изменить параметры ядра без перекомпиляции ядра или перезагрузки машины. Для внесения постоянных изменений следует изменить файл /etc/sysctl.conf. ### Настройка Для фильтрации пакетов ICMP: `net.ipv4.icmp_echo_ignore_all = 1` — Переадресация IP-пакетов должна быть включена только на серверах, которые действуют как маршрутизаторы или шлюзы. На всех других серверах эту функцию необходимо отключить: `net.ipv4.ip_forward = 0` — Проверка исходного адреса помогает против атаки спуфинга: «` net.ipv4.conf.all.rp_filter = 1 «` — В атаке типа SYN-флуд система заполняется серией пакетов SYN. Каждый пакет заставляет систему выдавать ответы SYN-ACK. Затем система ожидает ACK, который следует за SYN+ACK (3-стороннее рукопожатие). Поскольку атака никогда больше не отправляет обратно ACK, все системные ресурсы заполняются, т. е. очередь невыполненных работ. Как только очередь будет заполнена, система будет игнорировать входящие запросы от законных пользователей на услуги (http/mail и т.д.). Чтобы это остановить, вам нужно включить SYNcookies в sysctl.conf. `net.ipv4.tcp_syncookies = 1` — Атака smurf — это использование широковещательной адресации Интернет-протокола (IP) для создания отказа в обслуживании. Программа smurf создает сетевой пакет, который, как представляется, исходит от другого адреса (это называется подменой IP-адреса). Пакет содержит сообщение проверки связи ICMP, адресованное широковещательному IP-адресу, т. е. всем IP-адресам в данной сети. Эхо-ответы на пинг-сообщение отправляются обратно на адрес «жертвы». Достаточное количество эхо-запросов и результирующих эхо-сигналов может затопить сеть, сделав ее непригодной для реального трафика. Один из способов победить смурфинг — отключить широковещательную IP-адресацию. `net.ipv4.icmp_echo_ignore_broadcasts = 1` — После внесения необходимых изменений необходимо сохранить файл и выполнить следующую команду, чтобы загрузить настройки sysctl из файла /etc/sysctl.conf. `sysctl -p` ### 21. Отдельные разделы диска для системы Linux При установке системы на этапе разметки диска необходимо выполнить следующую последовательность действий:    Затем Вам будет предложено ввести пароль для шифрования диска:  Если всё прошло успешно — видим следующую картину и выбираем finish:  ### 22. Дисковые квоты Квота файловой системы — это стандартная встроенная функция ядра Linux. Квоты определяют объем пространства, которое может занять пользователь. Дисковые квоты также ограничивают количество файлов, которые пользователь может создать в системе. Установка пакета: «` root@debian:/# sudo apt install quota «` В системе могут отсутствовать модули ядра, поддерживающие использование квот. Вы должны убедиться в их наличии с помощью инструмента find и увидеть, что два модуля quota_v1 и quota _v2 находятся в каталоге /lib/modules: «` root@debian:/# find /lib/modules/`uname -r` -type f -name ‘*quota_v*.ko*’ /lib/modules/5.18.0-2-amd64/kernel/fs/quota/quota_v2.ko /lib/modules/5.18.0-2-amd64/kernel/fs/quota/quota_v1.ko «` Если один из модулей не найден, используйте следующую команду для установки модулей ядра квоты: `root@debian:/# sudo apt install linux-image-extra-virtual` Чтобы квоты были активными в конкретной системе, они должны быть смонтированы с соответствующими параметрами. Для этого отредактируем файл /etc/fstab: «` root@debian:/# sudo nano /etc/fstab «` Находим настройку для монтирования раздела, на который необходимо установить квоту и добавим нужные опции: UUID=ed2ad8e0-1359-425d-95a2-fea7e2d4af5c / ext4 errors=remount-ro`,usrquota,grpquota` 0 1 В данном примере мы установили квоту на корневой раздел, добавленные опции выделены. В вашем случае изначальная запись может отличаться. Между опциями пробел не ставить. Теперь перезапустим демона: «` root@debian:/# systemctl daemon-reload «` Перемонтируем раздел: «` root@debian:/# mount -o remount / «` Проверим, что нужные нам разделы теперь смонтированы с опциями квотирования: «` root@debian:/# mount | grep quota /dev/sda1 on / type ext4 (rw,relatime,quota,usrquota,grpquota,errors=remount-ro) «` ### 23. Выключайте IPv6 Убедимся что у машины есть IPv6-адрес: «` root@debian:/# sudo ifconfig ens33: flags=4163 mtu 1500 inet 192.168.183.221 netmask 255.255.255.0 broadcast 192.168.183.255 —> inet6 fe80::20c:29ff:fe9a:220c prefixlen 64 scopeid 0x20 «` Внесем изменения в файл /etc/sysctl.conf следующими командами, отключающими использование IPv6: «` root@debian:/# sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.all.disable_ipv6 = 1 root@debian:/# sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6 = 1 root@debian:/# sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6 = 1 «` Теперь проверим, пропал ли IPv6-адрес в выводе ifconfig: «` root@debian:/# sudo ifconfig ens33: flags=4163 mtu 1500 inet 192.168.183.221 netmask 255.255.255.0 broadcast 192.168.183.255 ether 00:0c:29:9a:22:0c txqueuelen 1000 (Ethernet) RX packets 18015 bytes 23218600 (22.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1646 bytes 135782 (132.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 «` ### 24. Отключение нежелательных бинарных файлов SUID и SGID Найдем все файлы с установленным UID: «` root@debian:/etc/pam.d# find / -perm -4000 /usr/libexec/polkit-agent-helper-1 /usr/sbin/pppd /usr/bin/pkexec /usr/bin/vmware-user-suid-wrapper /usr/bin/sudo /usr/bin/newgrp /usr/bin/gpasswd /usr/bin/ntfs-3g /usr/bin/passwd /usr/bin/chsh /usr/bin/umount /usr/bin/mount /usr/bin/chfn /usr/bin/fusermount3 /usr/bin/su /usr/lib/openssh/ssh-keysign /usr/lib/dbus-1.0/dbus-daemon-launch-helper /usr/lib/xorg/Xorg.wrap «` Подозрительных файлов не обнаружено. Теперь повторим операцию для файлов с установленным GID: «` root@debian:/etc/pam.d# find / -perm -2000 /var/mail /var/log/journal /var/log/journal/101ab1e9d0034518813af793b33ba799 /var/local /etc/ppp/peers /etc/chatscripts /usr/share/ppd/custom /usr/libexec/camel-lock-helper-1.2 /usr/sbin/unix_chkpwd /usr/bin/ssh-agent /usr/bin/chage /usr/bin/dotlockfile /usr/bin/expiry /usr/bin/crontab /usr/bin/wall /usr/bin/write.ul /usr/lib/xorg/Xorg.wrap /usr/local/share/fonts /run/log/journal «` Подозрительных файлов не обнаружено. ### 25. Файлы с возможностью записи из вне на сервере Linux Любой может изменить файл из вне, что приведет к проблеме безопасности. Используйте следующую команду, чтобы найти все файлы в которые можно писать из вне: «` root@debian:/etc/pam.d# find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print «` Подобных файлов не обнаружено. ### 26. Файлы, не принадлежащие пользователям Файлы, не принадлежащие ни одному пользователю или группе, могут представлять проблему безопасности. Просто найдите их с помощью следующей команды, которые не принадлежат действительному пользователю и действительной группе. «` root@debian:/etc/pam.d# find / -xdev \( -nouser -o -nogroup \) -print /var/cache/private/fwupdmgr «` Найден лишь один подобный файл, для которого отсутствие владельца и группы является нормой. ### 27. Используйте централизованную службу аутентификации > см. пункт 28 ### 28. Kerberos Kerberos – сетевой протокол аутентификации, позволяющий передавать данные через незащищённые сети для безопасной идентификации. Ориентирован, в первую очередь, на клиент-серверную модель и обеспечивает взаимную аутентификацию – оба пользователя через сервер подтверждают личности друг друга. **Терминология Kerberos** * Билет (ticket) – временные данные, выдаваемые клиенту для аутентификации на сервере, на котором располагается необходимая служба. * Клиент (client) – некая сущность в сети (пользователь, хост или сервис), которая может получить билет от Kerberos. * Центр выдачи ключей (key distribution center, KDC) – сервис, выдающий билеты Kerberos. * Область (realm) – сеть, используемая Kerberos, состоящая из серверов KDC и множества клиентов. Имя realm регистрозависимо, обычно пишется в верхнем регистре и совпадает с именем домена. * Принципал (principal) – уникальное имя для клиента, для которого разрешается аутентификация в Kerberos. Записывается в виде root[/instance]@REALM. **Конфигурация сервера** Зададим имя хоста: «` sudo hostnamectl set-hostname srv.com «` Установка: «` sudo apt install krb5-kdc krb5-admin-server «` На этапе установки Вам будет предложено указать имя области:  И имена серверов (указываем в обоих окнах хостнейм этого сервера):   Затем увидим:  Жмем enter, установка завершена. После установки пакетов на сервере нужно инициализировать realm командой: «` $ sudo krb5_newrealm «` И ввести ключ (придумать):  Теперь добавим в /etc/hosts следующие строки (221 — адрес сервера, 222 — клиента): «` 192.168.183.221 srv.com kdc 192.168.183.221 srv.com server 192.168.183.222 client.com client «` Затем войдем в админку и создадим нового пользователя с приставкой admin:  Внесем изменения в файл /etc/krb5kdc/kadm5.acl, укажем там пользователя, которого только что создали:  Теперь перезапустим сервис: «` systemctl restart krb5-admin-server «` **Конфигурация клиента** Зададим имя хоста: «` sudo hostnamectl set-hostname client.com «` Установка: «` apt install krb5-user libpam-ccreds libpam-krb5 «` Указываем тот же realm что и на сервере, а в следующих двух окнах вводим ip-адрес сервера:  Теперь мы можем соединиться в сервером:  ### 29. Логирование и аудит Настроим syslog на сбор всех логов с локальной системы. Главный конфигурационный файл — `/etc/syslog-ng/syslog-ng.conf` В нем сначал указывается версия: `@version: 3.27` Затем идет раздел `global options`, после чего начинается самое интересное — параметры `source, destination, filter, log`. #### Source (источник) Этот параметр содержит информацию об источнике логов. Можно указывать несколько источников, реализовано это аналогично с функциями на языке С. К примеру, источник по умолчанию описан таким образом: «` source s_src < system(); internal(); >; «` Здесь мы видим источник под названием s_src и параметрами system() и internal() без аргументов. При подключении такого источника будут собираться все логи системы. Мы можем указать в качестве источника какой-либо файл логов программы, например: «` source s_file < file("/var/log/messages"); >; «` #### Destination (назначение) Этот параметр указывает куда будут отправляться логи, полученные от источника. Они могут записываться в локальный файл: `destination d_test < file ("/var/log/test.log");>;` #### Log (логирование) Функция log принимает параметры source и destination и непосредственно записывает логи из указанного источника в указанное место назначения. Для записи локальных логов системы в файл /var/log/test.log используется такая конфигурация: «` source s_src < system(); internal(); >; destination d_local < file("/var/log/test.log"); >; log < source(s_src); destination(d_local); >; «` Теперь откроем файл /var/log/test.log и убедимся что логи записываются:  ### 30. Отслеживание подозрительных событий в журнале с помощью команды Logwatch / Logcheck Установка: «` root@debian:/# apt-get install logwatch «` Создайте временный каталог для работы logwatch: «` root@debian:/# sudo mkdir /var/cache/logwatch «` Для отображения отчета введите команду logwatch:  ### 31. Системный учет с помощью auditd Linux Audit Daemon — это среда, позволяющая проводить аудит событий в системе Linux. Используя мощную систему аудита возможно отслеживать многие типы событий для мониторинга и проверки системы, например: * доступ к файлам; * изменение прав на файлы; * просмотр пользователей, изменивших конкретный файл; * обнаружение несанкционированных изменений; * мониторинг системных вызовов и функций; * обнаружение аномалий, таких как сбои; * мониторинг набора команд. Установка auditd: «` root@debian:/# apt install auditd «` Конфигурация выполняется с помощью двух файлов: auditd.conf — настройка самого демона, audit.rules — настройка правил, используемых средством auditctl. > Примечание: auditctl — клиентский инструмент для настройки auditd. Файл auditd.conf настраивает демон аудита Linux (auditd) с акцентом на том, где и как он должен регистрировать события. Он также определяет, как работать с дисками, журналом повторов и количеством хранимых логов. Обычно стандартная конфигурация подходит для большинства систем. Чтобы настроить, какие именно события подвергать проверке, в структуре аудита используется файл правил с именем audit.rules. Активные правила можно просмотреть с помощью опции -l: «` root@debian:/# sudo auditctl -l No rules «` В данный момент никаких правил не задано. Давайте установим правило для мониторинга файла /etc/passwd. Соответствующая команда будет выглядеть следующим образом: «` root@debian:/# sudo auditctl -a exit,always -F path=/etc/passwd -F perm=wa «` Разберем подробнее. Ключ `-F` задет фильтры, определив переменную `path`, мы задаем, какой каталог или файл следует отслеживать. Переменная `path` определяет, какой вид доступа вызовет событие. Существует 4 вида доступа: * r = читать * w = писать * x = выполнить * a = изменить атрибут Ключ `-a` указывает список и действие. Допустимые списки: `task, exit, user, exclude`. Допустимые действия: `never, always`. Поиск связанного события или доступ к файлу можно быстро отслеживать с помощью инструмента ausearch: «` root@debian:/# sudo ausearch -f /etc/passwd —- time->Wed Jul 27 08:04:12 2022 type=PROCTITLE msg=audit(1658923452.931:216): proctitle=6E616E6F002F6574632F706173737764 type=PATH msg=audit(1658923452.931:216): item=1 name=»/etc/passwd» inode=1045055 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0 type=PATH msg=audit(1658923452.931:216): item=0 name=»/etc/» inode=1044481 dev=08:01 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0 type=CWD msg=audit(1658923452.931:216): cwd=»/etc/audit» type=SYSCALL msg=audit(1658923452.931:216): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=55d4f258c210 a2=241 a3=1b6 items=2 ppid=3788 pid=3935 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3 comm=»nano» exe=»/usr/bin/nano» subj==unconfined key=(null) «` * time — время события * name — имя объекта * cwd — текущий рабочий путь, из которого происходил доступ к файлу * syscall — связанный системный вызов * auid — идентификатор пользователя аудита * exe — двоичный файл, выполняющий действие над файлом Обратите внимание, что `auid` определяет исходного пользователя вошедшего в систему. Другие поля могут указывать на другого пользователя, в зависимости от того, какой пользователь используется при выполнении действия. Auditd может использоваться для мониторинга системных вызовов, включая доступ к файлам. Зададим следующее правило, чтобы отслеживать доступ к файлу /etc/passwd: «` auditctl -w /etc/passwd -p warx -k passwd «` Теперь вывдем содержимое файла: «` root@debian:/# cat /etc/passwd root:x:0:0:root:/root:/bin/bash . «` Посмотрим содержимое файла `/etc/var/audit/audit.log`: Информация и событии чтения файла `/etc/passwd` будет выглядеть там следующим образом: «` type=SYSCALL msg=audit(1659096248.614:264): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7f45cc1ff15e a2=80000 a3=0 items=1 ppid=2801 pid=2888 auid=1000 uid=0 gid> type=CWD msg=audit(1659096248.614:264): cwd=»/» type=PATH msg=audit(1659096248.614:264): item=0 name=»/etc/passwd» inode=1045055 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_f> «` Расшифровка записи o системном вызове: * type=SYSCALL Тип события (системный вызов ядра, ака SYSCALL). Полный список регистрируемых событий можно изучить в документации (https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sec-audit_record_types) * msg=audit(1659096248.614:264):Содержит штамп времени и уникальный ИД события audit(time_stamp:ID). Некоторые записи могут содержать один и тот же штамп времени и уникальный ИД если они являются частью одного и того же события произошедшего в одну и ту же единицу времени. Штамп времени может быть конвертирован командой date -d @1659096248.614 * arch=c000003e Содержит информацию об архитектуре процессора. Если запустить поиск событий с помощью команды ausearch -i `c000003e`|more то числовое значение c000003e в поле arch= будет конвертировано. * syscall=257 Тип системного вызова посланного в ядро. ausyscall —dump выдаст список всех системных вызовов для текущей архитектуры. Можно указать архитектуру, например ausyscall i386 117 выдаст ipc, а ausyscall x86_64 117 выдаст setresuid — т.е. значение одного и того же номера системного вызова различно для разных архитектур. * success=yes Успешность выполнения события — yes=успех, no=провал выполнения. * exit=3 Код выхода, возвращённый системным вызовом. Интерпретировать значение в человекочитаемый формат можно командой: ausearch —interpret —exit -13 (. success=no exit=-13(Отказано в доступе) . ). * ppid=2801 Parent Process ID (PPID) — ID родительского процесса * pid=2888 Process ID (PID) — ID процесса которому посвящено событие аудита * auid=1000 Audit user ID — ID пользователя в системе аудита, который присваивается при входе пользователя в систему и сохраняется неизменным даже при изменении идентификации/личности пользователя (например с помощью su — user2). * uid=0 User ID — ID пользователя запустившего анализируемый процесс. Его можно посмотреть в файле /etc/passwd, uid пользователя root равен 0. ### 32. Безопасный сервер OpenSSH OpenSSH это свободно распространяемая версия семейства инструментов для удаленного управления компьютерами и передачи файлов с использованием протокола безопасной оболочки (SSH). Традиционные инструменты, используемые для этих функций, такие как telnet и rcp, незащищены и передают пользовательский пароль открытым текстом. OpenSSH предоставляет сервис на сервере и клиентские приложения для облегчения операций защиты, зашифрованного удаленного управления и передачи файлов, эффективно заменяя устаревшие инструменты. Серверный компонент OpenSSH, sshd, постоянно ожидает клиентские подключения от любого клиентского приложения. Когда обнаруживается запрос на соединение, sshd устанавливает корректное соединение в зависимости от соединяющегося клиентского приложения. Например, если удаленный компьютер подсоединяется с помощью клиентского приложения ssh, сервер OpenSSH устанавливает сессию удаленного управления после авторизации. Если удаленный пользователь подсоединяется к серверу OpenSSH с помощью scp, сервис OpenSSH на сервере инициирует защищенное копирование файлов между сервером и клиентом после авторизации. OpenSSH может использовать много методов аутентификации, включая простой пароль, открытый ключ и билеты Kerberos. **Установка** Для установки клиентского приложения OpenSSH на вашей системе используйте команду: `root@debian:/# sudo apt-get install openssh-client` Для установки серверного приложения OpenSSH и связанных файлов используйте такую команду: `root@debian:/# sudo apt-get install openssh-server` **Конфигурация** Вы можете настроить поведение по умолчанию серверного приложения OpenSSH, sshd, редактируя файл /etc/ssh/sshd_config. Для информации по конфигурационным директивам, используемым в этом файле, вы можете посмотреть соответствующую страницу руководства, задав следующую команду в терминале: `man sshd_config` Прежде, чем редактировать конфигурационный файл, стоит создать копию оригинального файла и защитить его от записи, чтобы у вас были оригинальные настройки как справочник, который можно использовать повторно при необходимости. Скопируйте файл /etc/ssh/sshd_config и защитите его от записи с помощью следующих команд: «` root@debian:/# sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original root@debian:/# sudo chmod a-w /etc/ssh/sshd_config.original «` Далее примеры конфигурационных директив, которые вы можете изменить: > Чтобы установить TCP порт прослушивания для вашего OpenSSH 2222 вместо стандартного 22, измените директиву Port таким образом: Port 2222 > Чтобы sshd допускал вход с использованием открытых ключей, просто добавьте или измените строку: PubkeyAuthentication yes > Если строка уже присутствует, убедитесь, что она не закомментирована. > Чтобы позволить вашему OpenSSH серверу показывать содержимое файла /etc/issue.net в качестве шапки пред авторизацией, просто добавьте или измените строку: Banner /etc/issue.net Все изменения производятся в файле /etc/ssh/sshd_config. После изменений в /etc/ssh/sshd_config, сохраните файл и перестартуйте серверное приложение sshd для применения изменний, используя команду в терминале: «` root@debian:/# sudo /etc/init.d/ssh restart Restarting ssh (via systemctl): ssh.service. «` Множество других директив конфигурации sshd доступны для изменения поведения серверного приложения под ваши нужды. Однако учтите, что если единственный способ доступа к серверу — это ssh и вы допустили ошибку конфигурации sshd в /etc/ssh/sshd_config, вы можете найти свой сервер заблокированным, пока его не перезагрузите. В дополнение, если неправильная директива настройки воспринялась, сервер sshd может отказаться загружаться, поэтому будьте очень осторожны, когда редактируете этот файл на удаленном сервере. Для подключения к удаленному серверу используйте следующую команду (если вы меняли стандартный порт, то укажите его в опции -p): «` root@debian:/# ssh -p 2222 user@192.168.183.221 user@192.168.183.221’s password: Linux debian 5.18.0-2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.5-1 (2022-06-16) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. user@debian:~$ «` ### 33. Установка и использование системы обнаружения вторжений AIDE (расшифровывается как “Advanced Intrusion Detection Environment” усовершенствованная система обнаружения вторжений) — это одна из самых популярных систем для мониторинга изменений в операционных системах на базе Linux. AIDE используется для защиты от вредоносных программ, вирусов и обнаружения несанкционированных действий. Для проверки целостности файлов и обнаружения вторжений AIDE создает базу данных с информацией о файлах и сравнивает текущее состояние системы с этой базой. AIDE помогает сократить время расследования инцидентов, сосредоточившись на файлах, которые были изменены. Установка: «` apt install aide «` Первое, что вам нужно сделать после установки AIDE — это ее инициализировать. Инициализация заключается в создании базы данных (снимка) всех файлов и каталогов сервера. Для инициализации базы данных выполните следующую команду: `sudo aide —init —config /etc/aide/aide.conf` Выполнение займет некоторое время. Результат будет выглядеть следующим образом:  Приведенная выше команда создаст новую базу данных aide.db.new.gz в каталоге /var/lib/aide. Ее можно увидеть, используя следующую команду: `ls -l /var/lib/aide` Результат: «` total 51448 -rw——- 1 root root 52681989 Aug 9 08:53 aide.db.new «` AIDE не будет использовать этот новый файл базы данных, пока его не переименовать в aide.db. Это можно сделать следующим образом: `cp -p /var/lib/aide/aide.db.new /var/lib/aide/aide.db` Запустим проверку системы: «` aide —check —config /etc/aide/aide.conf «` Результат будет представлен в следующем виде:  ### 34. Отключение устройств USB/firewire/thunderbolt Введите следующую команду, чтобы отключить USB-устройства в системе Linux: «` root@debian:/# echo ‘install usb-storage /bin/true’ >> /etc/modprobe.d/disable-usb-storage.conf «` Тот же метод можно использовать для отключения модулей firewire и thunderbolt: «` root@debian:/# echo «blacklist firewire-core» >> /etc/modprobe.d/firewire.conf root@debian:/# echo «blacklist thunderbolt» >> /etc/modprobe.d/thunderbolt.conf «` После этого пользователи не смогут быстро скопировать конфиденциальные данные на USB-устройства или установить вредоносные программы/вирусы или бэкдор на вашу систему на базе Linux. ### 35. Отключение неиспользуемых служб > см. пункт 16 ### 36. Используйте fail2ban/denyhost в качестве IDS (установите систему обнаружения вторжений) Fail2ban или denyhost сканирует файлы журнала на предмет слишком большого количества неудачных попыток входа и блокирует IP-адрес, который проявляет признаки вредоносности. Fail2ban написан на языке программирования Python, может работать на POSIX-системах имеющих встроенный менеджер пакетов и брандмауэр, например, iptables .Fail2ban отслеживает файлы журналов, такие как /var/log/auth.log для обнаружения подозрительной активности. Обычно Fail2ban используется для обновления правил с целью блокировки IP-адресов на определённое время, но можно настроить и другие действия — например, отправку письма по электронной почте. Принцип работы fail2ban прост. Специальный сервис ищет в системных журналах (логах) записи о неудачных попытках аутентификации и при определенных условиях с помощью iptables блокирует IP-адреса, с которых ведется атака. Основная идея Fail2ban — при превышении заданного числа неудачных вводов пароля подряд (по умолчанию — 6) бан IP, с которого были попытки подбора на заданное время (по умолчанию — 600 секунд). #### **Установка** «`html $ apt-get install fail2ban «` #### Конфигурация На данном этапе Fail2ban уже готов к работе, базовая защита SSH сервера от перебора паролей будет включена по умолчанию. Но лучше всё-же внести некоторые изменения следуя рекомендациям ниже. У программы два основных файла конфигурации: `/etc/fail2ban/fail2ban.conf` — отвечает за настройки запуска процесса Fail2ban `/etc/fail2ban/jail.conf` — содержит настройки защиты конкретных сервисов Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки. Например секция [ssh] отвечает за защиту SSH от brute–force атак.Параметры из секции [DEFAULT] применяются ко всем секциям. **Основные параметры файла jail.conf** — `ignoreip` — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера — `bantime` — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных — `maxretry` — количество подозрительных событий, после которых применяется правило. В контексте брутфорса — это число неудавшихся попыток логина, после которых происходит блокировка. — `enabled` — значение указывает что данный jail активен, выключает действие изолятора — `port` — указывает на каком порту или портах запущен целевой сервис — `filter` — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса — `logpath` — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл #### Пример настройки fail2ban Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек `jail.conf`, для этого предусмотрены файлы с расширением `*.local`, которые автоматически подключаются и имеют высший приоритет. «` $ nano /etc/fail2ban/jail.local «` «` [DEFAULT] ## Постоянный IP-адрес. ## Если не переопределить ignoreip здесь, ## то стоит закомментировать этот параметр в jail.conf. ignoreip = 57.66.158.131 [ssh] ## если в течении 1 часа: findtime = 3600 ## произведено 6 неудачных попыток логина: maxretry = 6 ## то банить IP на 24 часа: bantime = 86400 «` Осталось перезапустить Fail2ban: `$ service fail2ban restart` ### 37. Защита сервера Apache Основной файл конфигурации Apache: `/etc/apache2/apache2.conf` Apache показывает свою версию с установленной на вашем сервере ОС. Это может быть серьезной угрозой безопасности как для вашего веб-сервера, так и для вашей Linux-системы. Чтобы Apache не отображал эту информацию миру, нам нужно внести некоторые изменения в основной файл конфигурации Apache. Откройте файл конфигурации с помощью редактора и найдите «ServerSignature», по умолчанию он включен. Если такой строки нет то добавьте её со значение Off. Еще одна строка «ServerTokens Prod» говорит Apache возвращать только Apache как продукт в заголовке ответа сервера при каждом запросе страницы. «` # nano /etc/apache2/apache2.conf ServerSignature Off ServerTokens Prod «` Мы можем ограничить доступ к каталогам с помощью параметров «Allow» и «Deny» в файле httpd.conf. Здесь, в этом примере, мы будем защищать корневой каталог, для этого установив следующее в файле apache2.conf. «` Options None Order deny,allow Deny from all «` Параметр «None» – этот параметр не позволяет пользователям включать какие-либо дополнительные функции. Order deny, allow – это порядок, в котором будут обрабатываться директивы «Allow» и «Deny». Здесь он сначала «отрицает», а затем «разрешает». Deny from all – будет отклонять запросы от всех к корневому каталогу, никто не сможет получить доступ к корневому каталогу. По умолчанию Apache следует символическим ссылкам, мы можем отключить эту функцию с помощью FollowSymLinks с директивой Options. И для этого нам нужно сделать следующую запись в основном файле конфигурации: `Options -FollowSymLinks` И, если любому конкретному пользователю или веб-сайту требуется включить FollowSymLinks, мы можем просто написать правило в файле этого веб-сайта: «` Options +FollowSymLinks «` Мы можем отключить серверные включения (mod_include) и выполнение CGI, если в этом нет необходимости: «` Options -Includes Options -ExecCGI «` Вот некоторые другие значения, которые можно включить или выключить с помощью директивы Options. `Options All` – включить все параметры одновременно. Это значение по умолчанию, если вы не хотите явно указывать какие-либо значения в конфигурационном файле Apache. `Options IncludesNOEXEC` – этот параметр позволяет включать на стороне сервера без разрешения выполнение команды или файлов CGI. `Options MultiViews` – позволяет контенту согласовывать множественные просмотры с модулем `mod_negotiation`. Параметры `Options SymLinksIfOwnerMatch` – это похоже на `FollowSymLinks`. Но так будет происходить только в том случае, если владелец совпадает между ссылкой и исходным каталогом, с которым она связана. ### 38. Защита файлов, каталогов и электронной почты См. пункт 21 ### 39. Резервные копии Создадим резервную копию каталога /home в файл /opt/backup/user_home.dump «` sudo dump -0f /opt/backup/user_home.dump /home «`  Просмотреть содержимое дампа можно с помощью утилиты restore: «` restore -tf /opt/backup/user_home.dump «`  Также restore предоставляет возможность восстановить данные из дампа. Для этого надо перейти в восстанавливаемый каталог и выполнить следующую команду: «` sudo restore -rf /opt/backup/user_home.dump «` ## Вывод В ходе практической работы изучены основные меры по усилению безопасности системы под управлением Linux, такие как избегание использования потенциально небезопасных служб (FTP, Telnet), минимизация программного обеспечения, автоматизация поддержки ядра и ПО в актуальном состоянии. Получены навыки шифрования передачи данных (SFTP), использования расширений безопасности (SELinux), настройки авторизации пользователей (политика паролей, ограничения на неудачные попытки входа и тд.), настройки безопасности BIOS. Рассмотрено управление разделами диска и способы работы с ними в Linux. Проведена установка и настройка служб, повышающих безопасность работы с сервером Linux (Kerberos, fail2ban, AIDE, OpenSSH, iptables). Исследованы примеры работы с системами логирования (syslog, logwatch).
Last changed by
Add a comment
Read more
Ход работы
Запускаю виртуальную консоль UPD: необходимо выбрать java консоль и работать через неё – тогда можно будет перезапустить систему и загрузиться с исошника с дебианом Загружаюсь в WinSrv 2019, иду в пункт Virtual Media, выбираю там в качестве CD/DVD исошник с дебиан 11 После чего я начал искать варианты перезагрузить и после нажатия сюда (см. скрин ниже) потерял сигнал от удаленного сервера:  Установка дебиан:
Инструкция к Практической работе_14 «Список задач по усилению безопасности сервера Linux, которые необходимо сделать.»
1. Шифрование передачи данных для сервера Linux Передача данных через sftp: Так как SFTP работает поверх SSH, первым делом необходимо установить OpenSSH как со стороны сервера (хранилища): $ sudo apt install openssh-server Также необходимо установить ssh на стороне клиента (устройства, с которого планируется доступ к хранилищу): $ sudo apt install ssh
Настройка syslog-ng и rsyslog
syslog-ng Главный конфигурационный файл — /etc/syslog-ng/syslog-ng.conf В нем сначал указывается версия: @version: 3.27 Затем идет раздел global options, после чего начинается самое интересное — параметры source, destination, filter, log. Source (источник)
Практическая работа 5: Сбор логов на одном сервере с нескольких других, посредством SysLog.
Цель работы Получить навыки сбора логов на одном сервере с нескольких других использую утилиту SysLog. Научиться анализировать полученные логи. Теоретические материалы к работе: Операционная система и работающие приложения постоянно создают различные типы сообщений, которые регистрируются в различных файлах журналов. Умение определить нужный файл журнала и что искать в нем поможет существенно сэкономить время и быстрее устранить ошибку. Журналирование является основным источником информации о работе системы и ее ошибках. Основные лог файлы