В статье приведено несколько распространенных подходов к обеспечению безопасности работы сервисов кассового сервера. Указанные подходы позволяют гибко выстраивать политику безопасности для сервисов в соответствии с конкретными целями.
Обеспечение безопасности конфигурационных файлов
Для обеспечения безопасности конфигурационных файлов необходимо запретить просмотр/редактирование конфигурационных файлов /opt/<название сервиса>/application.properties всем пользователям, кроме root, командой:
chmod 700 <путь к файлу/директории>
Операцию нужно повторить с конфигурационными файлами для всех установленных пакетов.
Безопасная авторизация
По умолчанию для авторизации на кассовом сервере используются:
- логин:
admin, - пароль:
admin.
Для возможности безопасной авторизации необходимо:
- Создать отдельные учетные записи для пользователей и сервисов, исходя из их назначения и требуемого уровня доступа. Подробнее о добавлении пользователя можно прочитать в разделе "Настройки сервера".
- Каждой учетной записи пользователя назначить соответствующую роль и набор прав. Подробнее о добавлении роли пользователя можно прочитать в разделе "Настройки сервера".
Изменить логин и пароль на кассовом сервере для каждой учетной записи.
Для нужных сервисов указать новый логин и пароль в конфигурационных файлах:
/opt/artixcs-sale-renderer/config.json/opt/artixcs-issuance-card/application.properties/opt/artixcs-online-card/application.properties/opt/artixcs-counter/application.properties/opt/artixcs-telegram-bot/application.properties/opt/artixcs-messaging-service/application.properties/opt/exchangers/config/cs/exchangers.ini/opt/artixcs-accounting-scheduled-impacts/application.properties/opt/artixcs-sales-ws/application.properties/opt/artixcs-datatransfer/application.properties/linuxcash/cash/exchangesystems/nes/config/nes_load.ini/opt/nes/config/nes_load.ini/opt/artixcs-sales-loader/application.properties/opt/artixcs-consultant-app/application.properties/opt/artixcs-ads/application.properties/opt/artixcs-cardsmobile/config.env/opt/artixcs-change-card/application.properties/opt/artix-report-sender/config.ini/opt/artixcs/docker/web_card_info/config.json
Авторизация по REST
Для авторизации по REST используются логин и пароль пользователя, созданного на кассовом сервере.
Для возможности безопасной авторизации необходимо:
На кассовом сервере в настройках включить аутентификацию в REST API.
Указать логин и пароль во всех сервисах с авторизацией по REST, которые установлены на отдельную машину (для доверенных узлов аутентификация выполняется автоматически).
Указанные в конфигурационном файле логин (rest.user) и пароль (rest.password) будут использованы для авторизации по REST при отправке запросов на кассовый сервер. Если пользователь с таким логином и паролем существует на кассовом сервере, то сервис должен авторизоваться без ошибок.Пример настройки логина и пароля для сервисов с авторизацией по RESTrest.port=38051 rest.host=localhost rest.user=admin1 rest.password=admin1
Безопасное подключение к БД
Изменить данные для подключения к БД (например, имя пользователя или хост). Для этого в /opt/artixcs-rest/application.properties необходимо добавить настройки (если по умолчанию они там отсутствуют):
Список основных сервисов, имеющих настройки подключения к БД:
artixcs-rest(mongodb,mysql,postgresql),artixcs-clickhouse-rest(mysql,postgresql),Начиная с версии КС #64 вместо сервиса
artixcs-clickhouse-restиспользуется сервисartixcs-sales-rest.artixcs-sales-rest(mysql,postgresql),сервис обмена (
nes),сервис
tomcat8-artix,artixcs-datatransfer(mysql,mssql),artixcs-counters(postgresq),artixcs-undercut-asset,artixcs-online-card,accrual-bonus (доступ к БД счетчиков),
artixcs-sales-ws,сервисы лояльности:
artixcs-accounting-coupons,artixcs-accounting-bonuses,artixcs-accounting-bonuses-certificates,artixcs-accounting-certificates.
mysql.host=<хост> mysql.port=<порт> mysql.user=<логин> mysql.password=<пароль>
В пароле для БД MySQL не рекомендуется использовать символы:
- {,
- },
- №.
postgresql.host=<хост> postgresql.port=<порт> postgresql.user=<логин> postgresql.password=<пароль>
Такой подход работает для:
сервисов
artixcs-rest,- сервисов лояльности:
artixcs-accounting-coupons,artixcs-accounting-bonuses,artixcs-accounting-bonuses-certificates,artixcs-accounting-certificates.
P.S. Также для более безопасной передачи данных на КЦ реализована возможность работы по протоколу https с отправкой https-запросов:
- через сервис
artixcs-rest-routing(начиная с версии КС #60 – устарел), - через сервис
artixcs-discovery.
Ограничение доступа к базам данных
MySQL
Ограничить доступ к БД можно несколькими способами:
использовать ролевую политику (рекомендованный способ):
ПримерREVOKE ALL PRIVILEGES, GRANT OPTION FROM 'netroot'@'%'; SHOW GRANTS for `netroot`@`%`; +-------------------------------------+ | Grants for netroot@% | +-------------------------------------+ | GRANT USAGE ON *.* TO `netroot`@`%` | +-------------------------------------+ 1 row in set (0.00 sec)
Видно, что прав у пользователя с другого хоста нет (USAGE подразумевает отсутствие прав). При попытке подключиться с другого хоста будет выведена ошибка:mysql> use artixcsAll; ERROR 1044 (42000): Access denied for user 'netroot'@'%' to database 'artixcsAll'
- использовать в конфигурационном файле mysql настройку
bind-address:- если требуется доступ извне, то необходимо записать в настройку значение
0.0.0.0, - если доступ к БД извне не требуется (контур локальный), то в настройку необходимо записать значение
127.0.0.1.
- если требуется доступ извне, то необходимо записать в настройку значение
Mongo
В целом процесс аналогичен описанному в подразделе MySQL. Чтобы ограничить доступ с других хостов, можно:
- указать в конфигурационном файле
/etc/mongod.confв настройкеbindIp=127.0.0.1(localhost), - использовать ролевую политику.
- Создадим пользователя qwerty / qwerty с правами только на чтение.
В конфигурационном файле mongo укажем:
security: authorization: enabled
- Перезапустим сервис.
Зайдем с указанием пользователя:
mongo -authenticationDatabase artixcs -u qwerty -p --host 192.169.11.11 --port 27017
Добавим произвольную запись:
db.getCollection('serverInfo').insertOne({"versionRest": 192})Получим ошибку:
WriteCommandError({ "ok" : 0, "errmsg" : "not authorized on artixcs to execute command { insert: \"serverInfo\", ordered: true, $db: \"artixcs\" }", "code" : 13, "codeName" : "Unauthorized" })Для подключения кассового сервера к защищенной MongoDB необходимо указать учетные данные в конфигурационном файле
/opt/artixcs-rest/application.properties:#Mongo ################################################################################################ # Подключение к СУБД Mongo для КС ################################################################################################ #spring.data.mongodb.host=${mongo.host:localhost} spring.data.mongodb.host=192.169.11.11 spring.data.mongodb.port=27017 spring.data.mongodb.database=artixcs spring.data.mongodb.authentication-database=admin spring.data.mongodb.username=qwerty spring.data.mongodb.password=qwerty
PostgreSQL
В целом процесс аналогичен описанному в подразделе MySQL:
- Для ограничения доступа к конфигурационным файлам необходимо использовать настройку
listen_addresses. Подробнее об этом можно прочитать здесь. - Для выдачи прав пользователям необходимо использовать соответствующие команды языка SQL. Подробнее об этом можно прочитать здесь и здесь.
Ограничение доступа к базам данных через фаервол
Этот подход можно использовать только в том случае, когда описанные выше подходы не дали желаемого результата.
Для управления доступом к БД можно использовать настройки фаервола. Для этого необходимо:
Добавить правило, разрешающее доступ для localhost:
iptables -I INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
Запретить всем доступ к порту 3306:
iptables -A INPUT -p tcp --dport 3306 -j DROP
При необходимости в начало цепочки добавить правило, разрешающее доступ избранным ip:
iptables -I INPUT -p tcp -s 192.169.11.11 --dport 3306 -j ACCEPT
В результате получится таблица с правилами для нужных ip:
1 ACCEPT tcp -- 192.169.11.11 anywhere tcp dpt:mysql 2 ACCEPT tcp -- 192.169.11.111 anywhere tcp dpt:mysql 3 DROP tcp -- anywhere anywhere tcp dpt:mysql