Панель управления Vesta и настройка безопасности

Панель управления Vesta и настройка безопасности

Один мой знакомый прикупив VDS и поставив панель управления Vesta на CentOS 6 задумался над вопросом безопасности:

Теперь я вот думаю как защитить сайты от взломов, вирусов, атак и прочей нечисти.

В тот день я ему написал довольно длинное письмо с примером своих настроек. Представляю вам переработанную версию того письма.

Прежде всего

Для обеспечения безопасности своего сервера необходимо своевременно обновлять программное обеспечение ОС, CMS сайтов и их модули. Также необходимо использовать разных пользователей для разных сайтов, потому как не всегда можно успеть вовремя обновить CMS.

Чтобы обновить ОС CentOS, нужно в терминале выполнить команду:

  1. yum update

Свой сервер я настраивал в такой последовательности:

  1. Установил панель управления Vesta
  2. Создал пользователя, который не отображается в панели, для административных задач
  3. Настроил sudo
  4. Создал ключи для авторизации по ssh
  5. Настроил sshd
  6. Установил и настроил knockd
  7. Настроил firewall (iptables)

Панель уравления Vesta

Установку нужно производить из под пользователя root

  1. curl -O http://vestacp.com/pub/vst-install.sh
  2. bash vst-install.sh

Создание пользователя

Создание пользователя в консоли, а не в админке нужно для того, что авторизоваться им по ssh, а затем использовать команду sudo.

Суть в том, что появиться пользователь к которому не будет доступа через http.

Пользователь admin у меня не имеет доступа по ssh (nologin).

Приведённая ниже команда создает пользователя и добавляет его в группу wheel, которая может запускать команду sudo.

  1. adduser -p password -G wheel username
  • username - имя создоваемого пользователя
  • password - пароль который будет у пользователя

sudo

Установка:

  1. yum install sudo

Настройки этой программы находятся в файле /etc/sudoers.

Вот мои:

## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhap using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
#Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
#Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
#Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

## Updating the locate database
#Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
#Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
#Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
#Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
#Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty

Defaults    env_reset
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY VESTA"


# Disable syslog loggging
Defaults !syslog

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
 %wheel        ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
admin   ALL=NOPASSWD:/usr/local/vesta/bin/*

С такими настройками команда будет спрашивать пароль текущего пользователя. Подробнее здесь.

Ключи для авторизации

Необходимо создать ключ авторизации SSH, а затем проверить его в работе на ранее созданом пользователе.

Создание:

  1. ssh-keygen -t rsa -b 4096 -C "Коментарий"

Более подробно:

Настройка sshd

Не использовать ftp! ssh наше все.
Я

Мой файл настроек /etc/ssh/sshd_config

#       $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options change a
# default value.

#Port 22
#AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::

# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
#AuthorizedKeysCommand none
#AuthorizedKeysCommandRunAs nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
PermitEmptyPasswords no
PasswordAuthentication no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# GSSAPI options
#GSSAPIAuthentication no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost no
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       ForceCommand cvs server

В этом файле запрещена поддержка протокола версии 1, авторизация пользователя root и авторизация по паролю.

knockd

Установка

  1. yum install knock-server

Настройка. Файл /etc/knockd.conf

[options]
        logfile = /dev/null

[opencloseSSH]
        sequence      = номер_порта:tcp,номер_порта:tcp,номер_порта:tcp
        seq_timeout   = 15
        tcpflags      = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout   = 21600
        stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

[opencloseVestaPanel]
        sequence      = номер_порта:tcp,номер_порта:tcp,номер_порта:tcp
        seq_timeout   = 15
        tcpflags      = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 8083 -j ACCEPT
        cmd_timeout   = 1800
        stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 8083 -j ACCEPT

Правило opencloseSSH открывает доступ к ssh на шесть часов.
Правило opencloseVestaPanel открывает доступ к панели управления Vesta на пол часа.

Обязательно прочитать lissyara.su - Port knocking

iptables

Установка утилиты настойки фаервола

  1. yum install system-config-firewall-tui

Запуск

  1. LANG=ru_RU.UTF-8 system-config-firewall-tui
  • Фаервол включить и запустить настройку
    Начало настройки
  • Оставить http, https и возможно добавить DNS, если собираетесь используешь сервер и в качестве DNS-сервера
    Доверенный службы
  • Вперед, Вперед ... до "Фильтр ICMP" там отметить все пункты
    Фильтр ICMP
  • ну и можно добавить файл пользовательских правил
    Custom Rules File
    файл iptables_custom_filter (или названный как нибудь по другому) должен находиться в каталоге /etc/sysconfig/

Итоги

После этих действий получается система работающая следующим образом:

SSH

  1. Для авторизации сначала стучимся программой knock по портам для открытия доступа к ssh
  2. Входим по ssh на сервер авторизуясь ключем
  3. Доступа к административным задачам используется sudo

Vesta

  1. Для авторизации сначала стучимся программой knock по портам для открытия доступа к панели управления Vesta
  2. Пользуемся ею

Послесловие

Настройка производилась ещё до появления управления правилами iptables в панели управления Vesta.

Также советую разобраться с программой fail2ban.