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

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

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

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

cd eccm/2.2/

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

eccm/.env
...
# 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
...

В файле postgres/.env обновите пароль:

postgres/.env
...
ROOT_POSTGRES_USER=tester
ROOT_POSTGRES_PASSWORD=tester_password
...

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

postgres/data/init-db/002_create_user.sql
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:

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

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

cd eccm/2.2/

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

eccm/.env
...
# 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
...

В файле postgres/.env обновите пароль:

postgres/.env
...
ROOT_POSTGRES_USER=tester
ROOT_POSTGRES_PASSWORD=old_tester_password
...

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

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


Настройка HTTPS

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


Настройка postgres

Настройка postgres позволяет ограничить доступ нежелательных пользователей к базе данных.

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

sudo docker network inspect bridge | grep "Subnet"
			        "Subnet": "172.17.0.0/16",
sudo docker network inspect postgres_default | grep "Subnet"
                    "Subnet": "172.18.0.0/16",
sudo docker network inspect eccm_eltex-internal | grep "Subnet"
                    "Subnet": "172.19.0.0/16",

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

postgres/data/pg_hba.conf
# 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.17.0.0 255.255.0.0  md5  # docker network bridge
host    all             all             172.18.0.0 255.255.0.0  md5  # docker network postgres_default
host    all             all             172.19.0.0 255.255.0.0  md5  # docker network eccm_eltex-internal

Перезапустите контейнеры:

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


Настройка firewall

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

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

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/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDubL15JQlEi2Nlrblwh+Iw+D8FakZnfs+B6H++YcQRrakoiUW6Zvd6DoSEPcKDMg6qnJ+ ... w/LhsLjD= admin@ECCM-admin

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

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

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

sudo systemctl restart sshd

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

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

  • Установка Fail2ban

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

Dedian и Ubuntu
apt-get install fail2ban
Astra Linux
yum install fail2ban
  • Настройка конфигурационного файла

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

sudo vim /etc/fail2ban/ssh.conf
/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
  • Нет меток