Проверка открытых портов на сервере Linux является важной задачей для системного администратора, чтобы обеспечить безопасность и правильное функционирование сервисов.
Команда:
sudo netstat -tuln
Ожидаемый результат:
Вывод команды покажет список всех открытых портов и адресов, которые их слушают. Например:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp6 0 0 :::123 :::*
Команда:
sudo ss -tuln
Ожидаемый результат:
Вывод команды покажет аналогичную информацию, что и netstat. Например:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 :::80 :::*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 :::123 :::*
Команда:
sudo lsof -i -P -n
Ожидаемый результат:
Вывод команды покажет список всех сетевых подключений и открытых портов. Например:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 56789 0t0 TCP *:22 (LISTEN)
httpd 5678 www-data 4u IPv6 12345 0t0 TCP *:80 (LISTEN)
ntpd 9101 ntp 5u IPv4 67890 0t0 UDP *:123
Команда:
sudo nmap -sT -O localhost
Ожидаемый результат:
Вывод команды покажет список всех открытых портов на локальном хосте. Например:
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-10 12:34 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00012s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
123/udp open ntp
OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.34 seconds
Команда:
sudo firewall-cmd —list-all
Ожидаемый результат:
Вывод команды покажет текущую конфигурацию брандмауэра, включая разрешенные порты. Например:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh http https
ports: 123/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Команда:
sudo iptables -L -n -v
Ожидаемый результат:
Вывод команды покажет текущие правила брандмауэра, включая разрешенные и заблокированные порты. Например:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
10M 600G ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
100K 50M ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
50K 25M ACCEPT udp — * * 0.0.0.0/0 0.0.0.0/0 udp dpt:123
Команда:
sudo ufw status
Ожидаемый результат:
Вывод команды покажет текущие правила брандмауэра ufw, включая разрешенные и заблокированные порты. Например:
Status: active
To Action From
— —— —-
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
123/udp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
123/udp (v6) ALLOW Anywhere (v6)
Команда:
nc -zv localhost 1-65535
Ожидаемый результат:
Вывод команды покажет, какие порты открыты на локальном хосте. Например:
Connection to localhost 22 port [tcp/ssh] succeeded!
Connection to localhost 80 port [tcp/http] succeeded!
Команда:
telnet localhost 22
Ожидаемый результат:
Если порт открыт, вы увидите сообщение о подключении. Например:
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
Команда:
curl -I http://localhost:80
Ожидаемый результат:
Если порт открыт и веб-сервер работает, вы увидите заголовки ответа HTTP. Например:
HTTP/1.1 200 OK
Date: Tue, 10 Oct 2023 12:34:56 GMT
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Tue, 10 Oct 2023 12:00:00 GMT
Content-Type: text/html
Content-Length: 1234
Команда:
ps aux | grep <service_name>
Ожидаемый результат:
Вывод команды покажет информацию о процессах, связанных с указанным сервисом. Например, для проверки процесса sshd:
ps aux | grep sshd
Результат:
root 1234 0.0 0.1 123456 7890 ? Ss 12:00 0:00 /usr/sbin/sshd -D
user 5678 0.0 0.0 123456 2345 pts/0 S+ 12:01 0:00 grep —color=auto sshd
Команда:
sudo journalctl -u <service_name>
Ожидаемый результат:
Вывод команды покажет логи для указанного сервиса. Например, для проверки логов sshd:
sudo journalctl -u sshd
Результат:
Oct 10 12:00:00 server sshd[1234]: Server listening on 0.0.0.0 port 22.
Oct 10 12:00:00 server sshd[1234]: Server listening on :: port 22.
Команда:
sudo tcpdump -i <interface> port <port_number>
Ожидаемый результат:
Вывод команды покажет сетевой трафик для указанного интерфейса и порта. Например:
sudo tcpdump -i eth0 port 22
Результат:
12:00:01.123456 IP client.12345 > server.ssh: Flags [S], seq 1234567890, win 65535, options [mss 1460,sackOK,TS val 123456789 ecr 0,nop,wscale 7], length 0
12:00:01.123457 IP server.ssh > client.12345: Flags [S.], seq 1234567890, ack 1234567891, win 29200, options [mss 1460,sackOK,TS val 123456789 ecr 123456789,nop,wscale 7], length 0
Пример конфигурации sshd:
Файл: /etc/ssh/sshd_config Параметр:
Port 22
Пример конфигурации nginx:
Файл: /etc/nginx/sites-available/default Параметры:
server { listen 80 default_server; listen [::]:80 default_server; … }
Пример скрипта на Bash для проверки открытых портов:
#!/bin/bash
PORTS=(22 80 443)
for PORT in «${PORTS[@]}»; do
if nc -zv localhost $PORT 2>&1 | grep -q succeeded; then
echo «Port $PORT is open»
else
echo «Port $PORT is closed»
fi
done
Инструменты:
Пример использования Ansible для управления портами:
Создайте плейбук Ansible для настройки брандмауэра и открытых портов.
Файл: firewall.yml
—
— name: Configure firewall
hosts: all
become: yes
tasks:
— name: Ensure UFW is installed
apt:
name: ufw
state: psent
— name: Allow SSH
ufw:
rule: allow
port: ’22’
proto: tcp
— name: Allow HTTP
ufw:
rule: allow
port: ’80’
proto: tcp
— name: Allow HTTPS
ufw:
rule: allow
port: ‘443’
proto: tcp
— name: Enable UFW
ufw:
state: enabled
policy: allow
Запустите плейбук Ansible:
ansible-playbook -i inventory firewall.yml
Пример использования Puppet для управления настройками портов:
Создайте манифест Puppet для настройки брандмауэра.
Файл: firewall.pp
class { ‘firewall’: }
firewall { ‘100 allow SSH’:
proto => ‘tcp’,
dport => 22,
action => ‘accept’,
}
firewall { ‘101 allow HTTP’:
proto => ‘tcp’,
dport => 80,
action => ‘accept’,
}
firewall { ‘102 allow HTTPS’:
proto => ‘tcp’,
dport => 443,
action => ‘accept’,
}
Если вы используете контейнеризацию, важно управлять портами внутри контейнеров и на хосте.
Пример команды Docker для запуска контейнера с открытыми портами:
docker run -d -p 80:80 -p 443:443 —name my_web_server nginx
Пример Docker Compose файла для управления портами:
Файл: docker-compose.yml
version: ‘3’
services:
web:
image: nginx
ports:
— «80:80»
— «443:443»
Управление открытыми портами на сервере — это важный аспект обеспечения безопасности и стабильности работы ваших сервисов. Используйте разнообразные инструменты и методы для мониторинга, настройки и автоматизации управления портами. Регулярно обновляйте конфигурации и следите за состоянием серверов, чтобы обеспечить высокий уровень защиты от внешних угроз.
Открытые порты на сервере могут представлять различные угрозы и проблемы для безопасности и стабильности системы. Вот перечень потенциальных проблем и угроз, связанных с открытыми портами:
Открытые порты могут позволить злоумышленникам получить неавторизованный доступ к системе. Например, открытый SSH-порт (22) может быть использован для брутфорс-атак с целью получения доступа к серверу.
Открытые порты могут стать целью распределенных атак типа «отказ в обслуживании» (DDoS), что может привести к перегрузке сервера и недоступности легитимных сервисов.
Злоумышленники могут использовать уязвимости в сервисах, работающих на открытых портах, для выполнения атак типа «эксплойт». Например, уязвимости в веб-серверах (порт 80 или 443) могут быть использованы для выполнения удаленного кода.
Открытые порты могут позволить злоумышленникам перехватывать и анализировать сетевой трафик (сниффинг), что может привести к утечке конфиденциальной информации.
Открытые порты могут быть обнаружены с помощью инструментов для сканирования портов (например, nmap). Это может дать злоумышленникам информацию о сервисах, работающих на сервере, и помочь в планировании дальнейших атак.
Открытые порты могут быть использованы для распространения вредоносного ПО, такого как вирусы, черви или трояны. Например, червь может использовать открытые порты для распространения на другие системы в сети.
Открытые порты могут привести к увеличению нагрузки на сервер из-за большого количества входящих подключений. Это может вызвать проблемы с производительностью и замедление работы легитимных сервисов.
Сервисы, работающие на открытых портах и не получающие регулярных обновлений, могут содержать уязвимости, которые могут быть использованы злоумышленниками для атак.
Открытые порты могут позволить злоумышленникам получить доступ к конфиденциальной информации, такой как конфигурационные файлы, базы данных или пользовательские данные.
Информация о сервисах, работающих на открытых портах, может быть использована в атаках социальной инженерии для получения доступа к системе через обман пользователей или администраторов.
Открытые порты могут привести к несоответствию требованиям безопасности и нормативным актам, таким как GDPR, HIPAA или PCI DSS. Это может привести к юридическим последствиям и штрафам.
Злоумышленники могут использовать уязвимости в сервисах, работающих на открытых портах, для эскалации привилегий и получения административного доступа к системе.
Открытые порты могут позволить злоумышленникам вмешиваться в работу сервисов и изменять данные, что может нарушить целостность и достоверность информации.
Атаки на сервисы, работающие на открытых портах, могут привести к недоступности данных для легитимных пользователей, что может повлиять на бизнес-процессы и операции.
Пример конфигурации сервера Linux с точки зрения безопасности портов
Для настройки сервера Linux с фокусом на безопасность открытых портов, рассмотрим пример, который включает в себя использование брандмауэра, минимизацию открытых портов, настройку служб и использование дополнительных средств безопасности. В этом примере мы будем использовать ufw (Uncomplicated Firewall) для управления правилами брандмауэра и fail2ban для защиты от брутфорс-атак.
Убедитесь, что у вас установлены необходимые пакеты:
sudo apt update sudo apt install ufw fail2ban
2.1. Отключите UFW (если он включен)
sudo ufw disable
2.2. Настройка базовых правил
Разрешите доступ только к необходимым портам. Например, для SSH (22), HTTP (80) и HTTPS (443):
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
2.3. Включите UFW
sudo ufw enable
2.4. Проверьте статус UFW
sudo ufw status verbose
Вывод должен быть похож на это:
Status: active
To Action From
— —— —-
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Fail2Ban поможет защитить ваш сервер от попыток несанкционированного доступа.
3.1. Настройка Fail2Ban
Откройте конфигурационный файл:
sudo nano /etc/fail2ban/jail.local
Добавьте следующие строки для настройки защиты SSH:
ini
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 600
3.2. Перезапустите Fail2Ban
sudo systemctl restart fail2ban
3.3. Проверьте статус Fail2Ban
sudo fail2ban-client status
Откройте только те порты, которые необходимы для работы вашего сервера. Если некоторые службы не используются, удалите их или отключите.
Если вы используете только SSH и веб-сервер, убедитесь, что другие порты, такие как FTP (21), Telnet (23), и другие, закрыты.
5.1. Настройка SSH
Откройте файл конфигурации SSH:
sudo nano /etc/ssh/sshd_config
Измените или добавьте следующие параметры для повышения безопасности:
Port 22
PermitRootLogin no # Запретить вход под root
PasswordAuthentication no # Запретить аутентификацию по паролю
PubkeyAuthentication yes # Включить аутентификацию по ключу
ChallengeResponseAuthentication no
UsePAM yes
5.2. Перезапустите SSH
sudo systemctl restart ssh
Убедитесь, что ваш сервер всегда обновлен:
sudo apt update && sudo apt upgrade -y
Используйте инструменты мониторинга, такие как htop, netstat, и ss, для регулярной проверки состояния сервера и открытых портов.
sudo netstat -tuln