Подготовка промышленного сервера на CentOS 5

Политика безопасности

Этап: Физическая защита

Отключение USB mass storage

<pre>echo "Disabling USB Mass Storage" echo "blacklist usb-storage" > /etc/modprobe.d/blacklist-usbstorage</pre>
</div>
</div>

Права пользователей

Запрещение для root: Когда сервер работает и успешно запущен, пользователь root может подключаться только в экстренных ситуациях, обычно для этого требуется монитор и консоль, соотв., логиниться можно только в определенных местах (серверная). Чтобы вкл.

Эту возможность мы редактируем файл /etc/securetty :

<pre>echo "tty1" > /etc/securetty
chmod 700 /root

Обязательно использование sudo!

Запрещаем cron от root

<pre>echo "Locking down Cron" touch /etc/cron.allow
chmod 600 /etc/cron.allow
awk -F: '{print $1}' /etc/passwd | grep -v root > /etc/cron.deny
echo "Locking down AT" touch /etc/at.allow
chmod 600 /etc/at.allow
awk -F: '{print $1}' /etc/passwd | grep -v root > /etc/at.deny</pre>
</div>

Политики установки пароля:

Должны быть установлены устойчивые к подбору пароли, содержащие спец символы и длинной не менее 8 символов.

  • «Password complexity requirements should be in place to enforce strong password usage.
  • Passwords should be changed reasonably regularly. Some folks argue the value of changing passwords, however the longer you have a password, the longer someone has to break it. Conversely, if you’re frequently changing passwords, your users will tend to use weaker passwords in order to remember them. You should to find a happy medium that suits your organization.
  • Passwords shoudn’t be changed more than once a day»
<pre>echo "Passwords expire every 180 days" perl -npe 's/PASS_MAX_DAYS\s+99999/PASS_MAX_DAYS 180/' -i /etc/login.defs
echo "Passwords may only be changed once a day" perl -npe 's/PASS_MIN_DAYS\s+0/PASS_MIN_DAYS 1/g' -i /etc/login.defs</pre>

Установить шифрование паролей sha1 md5:

authconfig --passalgo=sha512 --update</pre>

Устанавливаем таймаут сессии и выкидываем все зависшие сессии:

echo "Idle users will be removed after 15 minutes" echo "readonly TMOUT=900" >> /etc/profile.d/os-security.sh
echo "readonly HISTFILE" >> /etc/profile.d/os-security.sh
chmod +x /etc/profile.d/os-security.sh</pre>

Umask ограничения

Umask 077 рекомендована для безопасности, но может помешать, если Ваши пользователи расшаривают файлы.

<pre>perl -npe 's/umask\s+0\d2/umask 077/g' -i /etc/bashrc
perl -npe 's/umask\s+0\d2/umask 077/g' -i /etc/csh.cshrc</pre>

PAM модификация:

Теперь нам необходимо обновить /etc/pam.d/system-auth

touch /var/log/tallylog
cat << 'EOF' > /etc/pam.d/system-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth        required      pam_env.so auth        sufficient    pam_unix.so nullok try_first_pass auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so
auth        required      pam_tally2.so deny=3 onerr=fail unlock_time=60   account     required      pam_unix.so account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so
account     required      pam_tally2.so per_user

password    requisite     pam_cracklib.so try_first_pass retry=3 minlen=9 lcredit=-2 ucredit=-2 dcredit=-2 ocredit=-2 password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=10 password    required      pam_deny.so   session     optional      pam_keyinit.so revoke session     required      pam_limits.so session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
EOF

Файл /var/log/tallylog – это бинарный лог, содержащий отброшенные попытки аутентификации — логина для pam. Мы можем посмотреть неуспешные попытки доступа используя команду pam_tally2 без каких-либо доп.опций и разблокировать пользовательские аккаунты с помощью pam_tally2 –reset -u username

Сетевая безопасность

Конфигурация Sysctl Security:
Меняем настройки /etc/sysctl.conf на указанные ниже:

<pre>net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_max_syn_backlog = 1280
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_timestamps = 0</pre>
</div>

Использование TCP Wrappers

Контролируем все сетевые соединения, в данном примере, запрещаем все, кроме ssh:

<pre>echo "ALL:ALL" >> /etc/hosts.deny
echo "sshd:ALL" >> /etc/hosts.allow</pre>

Усиливаем контроль соединений с помощью IPTables:

Правила по-умолчанию, разрешают любой трафик, оставляют открытыми все порты. Мы хотим это исправить. Открываем для редактирования файл /etc/sysconfig/iptables и посмотрим на первые 3 линии и увидим 2 проблемы: правила INPUT & FORWARD разрешают все сетевые соединения. Более «строгая» настройка виглядит так:

<pre>#Drop anything we aren't explicitly allowing. All outbound traffic is okay
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-reply -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# Accept Pings
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Log anything on eth0 claiming it's from a local or non-routable network
# If you're using one of these local networks, remove it from the list below
-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF A: "
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF B: "
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG --log-prefix "IP DROP SPOOF C: "
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG --log-prefix "IP DROP MULTICAST D: "
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG --log-prefix "IP DROP SPOOF E: "
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG --log-prefix "IP DROP LOOPBACK: "
# Accept any established connections
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept ssh traffic. Restrict this to known ips if possible.
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#Log and drop everything else
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT

Политика безопасности. Настройка SSH.

Используем стойкие к перебору пароли:

  • Минимум 8 символов
  • Миксуем нижний и верхний регистр
  • Миксуем цифры и буквы
  • Используем на арифметические символы ( ! » £ $ % ^ и т.п.)

Запрещаем логин из под root:

Настройки ssh сервера находятся : /etc/ssh/sshd_config

# Prevent root logins:
PermitRootLogin no
service sshd restart</pre>

Для доступа используем sudo.

Ограничим пользовательский доступ:

В системе может существовать несколько пользователей заведенных в шелл, под которыми работают определенные сервисы и к которым привязаны свои права, но только единицам нужен удаленный доступ по ssh, настроим: /etc/ssh/sshd_config

AllowUsers alice remote-usr89</pre>

Отключаем протокол ssh v1:

# Protocol 2,1
Protocol 2</pre>

Используем нестандартный порт:

По-умолчанию ssh слушает на 22 порту, это известно всем, поэтому следует поменять порт. Идем в /etc/ssh/sshd_config :

# Run ssh on a non-standard port:
Port 2345  # Изменен порт</pre>

Подключаемся к консоли:

$ ssh -p 2345 lab01.nagg.ru</pre>

~/.ssh/config должен иметь следующие разрешения:

$ chmod 600 ~/.ssh/config</pre>

Фильтруем доступ ssh правилами IPTables:

iptables -A INPUT -p tcp -s 195.1.1.1 --dport 22 -j ACCEPT</pre>

SSH поддерживает TCP Wrappers и доступ к сервису может согласовываться с содержимым файлов hosts.allow и hosts.deny. В случае, если нет возможности указать явные IP для доступа к сервису, ssh будет доступен извне всем. Можно предотвратить брутфорс -атаки и писать в лог все попытки используя IPTables (+ fail2ban).

Пример:

<pre>iptables -A INPUT -p tcp --dport 22 -m recent --set --name ssh --rsource
iptables -A INPUT -p tcp --dport 22 -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT</pre>

Первое правило записывает IP адрес каждой попытки доступа к порту 22. Второе правило проверяет кол-во подключений с одного IP в ед времени (4/60сек)

Устанавливаем лимит подключений в минуту для одного IP (3 коннекта в минуту)

<pre>iptables -A INPUT -p tcp --dport 22 --syn -m limit --limit 1/m --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 --syn -j DROP

На этом предварительная настройка закончена.

Related posts:

  1. Настройка OpenVPN сервера на Linksys WRT54GL Настройка OpenVPN сервера на Linksys WRT54GL. Интересное решение для удаленного...
  2. Установка и конфигурирование защищенного FTP-SSL сервера Сервис предлагается поднять на ProFTPd. Собирать будем из исходников, так...
  3. Настройка PPTP-сервера в Debian/Ubuntu В данной статье мы установим и настроим pptp сервер для...
  4. OpenSSL. Шифрование. Создание сертификатов. OpenSSL – набор утилит для различного вида шифрования.  Широко распространен...
You can leave a response, or trackback from your own site.

Оставить комментарий

*