В данном разделе приведены рекомендации для повышения безопасности при использовании ECCM.

Смена паролей по умолчанию 

Замена стандартных паролей на уникальные сложные пароли предотвращает несанкционированный доступ к веб-интерфейсу ECCM. 

Перейдите в рабочую директорию ECCM:

cd eccm/2.8/

В файле eccm/.env замените значение пароля пользователя peeper_monitor и все вхождения tester_password/eccm_password на ваш пароль:

...
# Root credentials для развертки и настройки базы данных
ROOT_POSTGRES_USER=tester
ROOT_POSTGRES_PASSWORD=tester_password
# Client info для работы с базой данных
ECCM_POSTGRES_DB=eccm
ECCM_POSTGRES_USER=eccm
ECCM_POSTGRES_PASSWORD=eccm_password
...
PEEPER_MONITOR_POSTGRES_USER=peeper_monitor
PEEPER_MONITOR_POSTGRES_PASSWORD=peeper_monitor
...

При использовании ЕССМ в отказоустойчивой системе, замените пароль пользователя peeper_monitor в конфигурационном файле .env.cluster

Замените пароль в SQL-запросе для создания пользователя eccm:

CREATE USER "eccm" WITH ENCRYPTED PASSWORD 'eccm_password';
GRANT all privileges on DATABASE "eccm" to "eccm";

Для того чтобы контейнеры смогли подключаться к БД после изменения паролей, необходимо удалить контейнеры и создать их заново. Данные в БД при этом останутся (если инсталляция ECCM производится на чистую виртуальную машину, то контейнеры удалять не обязательно, так как они еще не запущены):

sudo ./compose-tools.sh --delete-containers

Запустите контейнеры ECCM с помощью compose-tools.sh и необходимых опций, например:

sudo ./compose-tools.sh --https --start <IP-адрес сервера или его доменное имя> 


Смена паролей при текущей эксплуатации

Перейдите в контейнер postgres-postgres-1:

docker exec -ti postgres-postgres-1 bash

Войдите в БД под пользователем tester:

psql -d eccm -U tester

Измените пароли для пользователей tester, eccm  и peeper_monitor:

ALTER USER tester WITH ENCRYPTED PASSWORD 'new_tester_password';
ALTER USER eccm WITH ENCRYPTED PASSWORD 'new_eccm_password';
ALTER USER peeper_monitor WITH ENCRYPTED PASSWORD 'new_peeper_monitor_password';

Выйдите из контейнера postgres и перейдите в рабочую директорию ECCM:

cd eccm/2.8/

В файле eccm/.env замените все вхождения old_tester_password, old_eccm_password и old_peeper_monitor_password на ваш новый пароль:

...
# Root credentials для развертки и настройки базы данных
ROOT_POSTGRES_USER=tester
ROOT_POSTGRES_PASSWORD=old_tester_password
# Client info для работы с базой данных
ECCM_POSTGRES_DB=eccm
ECCM_POSTGRES_USER=eccm
ECCM_POSTGRES_PASSWORD=old_eccm_password
...
PPEEPER_MONITOR_POSTGRES_USER=peeper_monitor
PEEPER_MONITOR_POSTGRES_PASSWORD=old_peeper_monitor_password
...

Перезапустите контейнеры ECCM с помощью compose-tools.sh и необходимых опций, например:

sudo ./compose-tools.sh --https --start <IP-адрес сервера или его доменное имя> --stop 


Настройка HTTPS

Запуск веб-интерфейса ECCM по протоколу HTTPS позволяет шифровать трафик между клиентом и приложением, защищая данные от перехвата. Инструкция по настройке доступна в разделе "Настройка доступа к ECCM по HTTPS".


Настройка PostgreSQL

Настройка PostgreSQL позволяет ограничить доступ нежелательных пользователей к базе данных. Для конфигурирования доступа необходимо, чтобы ЕССМ был запущен. 

Изменение настройки PostgreSQL при инсталляции ЕССМ в отказоустойчивой системе может привести к проблемам с его работой

Выведите подсети, которые использует docker:

sudo docker network inspect internal | grep "Subnet"
			        "Subnet": "172.21.0.0/16",
sudo docker network inspect external | grep "Subnet"
                    "Subnet": "172.20.0.0/16"

Во избежание утери выставленных настроек доступа, создайте новый файл:

cd <путь до каталога с файлами запуска ECCM>/postgres/
touch data/pg_hba.conf.tpl

Скопируйте текущую конфигурацию настроек доступа:

docker exec -i eccm-postgres cat /etc/postgresql/pg_hba.conf >> data/pg_hba.conf.tpl

Настройте доступ к БД только с localhost, с подсетей docker-а и адреса администратора при помощи любого текстового редактора:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
#host    all             all             all                     md5
host    all             all             <eccm_ip>/32            md5  # IP адрес ECCM приложений
host    all             all             <admin_ip>/32           md5  # опционально: IP адрес для удаленного подключения администратора к БД
host    all             all             172.21.0.0 255.255.0.0  md5  # docker network internal
host    all             all             172.20.0.0 255.255.0.0  md5  # docker network external

Вмонтируйте созданный файл настроек доступа к БД в файле postgres/docker-compose.yml:

services:
	postgres:
	...
	volumes:
		...
		- ./data/pg_hba.conf.tpl:/configurations/templates/pg_hba.conf.tpl
...

Перезапустите ЕССМ:

sudo ./compose-tools.sh --stop
sudo ./compose-tools.sh --https --start <IP-адрес сервера или его доменное имя>

Настройка firewall

Для обеспечения большей безопасности необходимо ограничить внешние подключения к серверу ECCM.

Создайте файл iptables.sh с правилами:

sudo iptables -P INPUT DROP                             # запрет всех входящих соединений
sudo iptables -P FORWARD DROP                           # запрет для всех проходящих через ваш хост соединений
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT      # SSH
sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT    # Postgres
# опционально, разрешим пинговать себя
sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# разрешим исходящие подключения, которые инициировали мы сами
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# разрешить обращения к localhost
sudo iptables -A INPUT -i lo -j ACCEPT

Примените правила:

chmod +x iptables.sh
sudo ./iptables.sh

Для того чтобы правила сохранились после перезагрузки, можно использовать утилиту iptables-persistent (или любые другие доступные методы):

sudo apt-get install iptables-persistent
sudo netfilter-persistent save


Дополнительная защита сервера

Использование SSH-ключей вместо паролей

Замена доступа по паролям на доступ по генерируемым локальной машиной ключам обеспечивает повышенную безопасность данных.

Сгенерируйте SSH-ключи на локальной машине администратора ECCM:

ssh-keygen

Скопируйте публичный ключ администратора ~/.ssh/id_rsa.pub с локального хоста в файл, расположенный на хосте ECCM ~/.ssh/authorized_keys:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDubL15JQlEi2Nlrblwh+Iw+D8FakZnfs+B6H++YcQRrakoiUW6Zvd6DoSEPcKDMg6qnJ+ ... w/LhsLjD= admin@ECCM-admin

Отключите вход по паролю в /etc/ssh/sshd_config:

...
PasswordAuthentication no          # Запретить вход по паролю
PermitRootLogin no                 # Запретить вход root
PubkeyAuthentication yes           # Разрешить вход по ключам
...

Перезапустите службу sshd:

sudo systemctl restart sshd

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

Fail2ban — программа для защиты серверов от brute-force атак, которая автоматически блокирует IP-адреса при множественных неудачных попытках входа по SSH.

В зависимости от типа ОС, выполните одну из следующих команд:

apt-get install fail2ban
yum install fail2ban

Создайте конфигурационный файл и настройте параметры по общим рекомендациям:

sudo vim /etc/fail2ban/ssh.conf
[sshd]
# активируем правило
enabled   = true
# Если Вы сменили порт SSH по умолчанию, замените 1234 на ваш новый порт
port     = ssh,1234
## если в течении 1 часа:
findtime    = 1h
## произведено 6 неудачных попыток логина:
maxretry    = 6
## то банить IP на 2 часа:
bantime     = 2h
# какие ip адреса игнорируются правилом
ignoreip  = 127.0.0.1/8 23.34.45.56
sudo systemctl restart fail2ban

Данный набор условий означает, что IP-адрес, с которого было произведено 6 неудачных попыток SSH-подключения за последний час, будет заблокирован на 2 часа. Не будут блокироваться IP-адреса в диапазоне от 127.0.0.1 до 127.0.0.8 и адрес 23.34.45.56. Стоит обратить внимание, что в данном примере "/8" — не маска, а конечный адрес устройства.

Время для параметров findtime и bantime можно указывать не только в секундах, но и в минутах, часах, днях и даже неделях. Для этого необходимо сразу после численного значения параметра указать соответствующую букву (m, h, d, w).

Команда для вывода на экран сведений о работе jail-а, отвечающего за службу sshd:

sudo fail2ban-client status sshd

С помощью данной команды можно посмотреть список заблокированных IP-адресов.

Если в данный момент машина не подвергается атаке, сразу после установки и запуска программы на экране будет отображена следующая информация: 

Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	

IP-адреса, попавшие в бан:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list: 192.168.х.х

Чтобы разблокировать IP-адрес, попавший в бан (например, 192.168.х.х), используйте следующую команду:

sudo fail2ban-client unban 192.168.x.x

Чтобы разблокировать все адреса, попавшие в бан, используйте следующую команду:

sudo fail2ban-client unban --all

Чтобы разблокировать IP-адрес из jail sshd, используйте следующую команду:

sudo fail2ban-client set sshd unbanip 192.168.x.x