Эта документация - руководство по установке ADF в тестовой или маломасштабной среде без высокой доступности и отказоустойчивости. Переход к установке с высокой доступностью требует дополнительного планирования и сложностей в настройке. Однако тестовая версия позволяет пользователям ознакомиться с программным обеспечением и в будущем, может быть обновлена до полноценной инфраструктуры с высокой доступностью и отказоустойчивостью.
Прежде чем приступить к установке, убедитесь, что ваша система удовлетворяет следующим требованиям:
Режим Swarm позволяет настраивать виртуальные сети и использовать различные функции compose-файла. Это позволяет правильно изолировать сервисы, предоставляя для внешнего доступа только необходимые.
Для настройки Docker Swarm можете воспользоваться инструкцией: Подготовка Docker
/opt/adf
├── adf.env
├── adf-xxx.yml
├── backup
│ └── db
├── cert
├── config
│ ├── access.yaml
│ ├── cert.pem
│ ├── config.yaml
│ └── key.pem
├── db
├── log
├── radius
│ ├── var_cache_samba
│ ├── var_lib_samba
│ └── var_lib_samba_private
├── _start.sh
├── _stop.sh
└── tgbot_template_vpn.hbs
Создайте структуру каталогов при помощи следующих команд:
mkdir -p /opt/adf
cd /opt/adf
mkdir -p backup/db cert config db db/_dump log
mkdir -p radius/var_cache_samba radius/var_lib_samba \
radius/var_lib_samba_private radius/_tmp
Конфигурация ADF состоит из нескольких параметров, все они имеют значения по умолчанию, но эти значения по умолчанию не были предназначены для 100% совместимости с новыми установками, поскольку каждая установка отличается, по крайней мере, адресами, именами доменов и т. д.
Вам нужно определить абсолютный минимум параметров конфигурации, чтобы все работало.
Файлы конфигурации должны быть в формате yaml.
Создайте следующую структуру на виртуальной машине:
/opt/adf/config/
.env <- общие параметры для нескольких сервисов
access.yaml <- учетные записи для получения конфигурации через adfconfcli
config.yaml <- комбинированные параметры для всех служб
key.pem <- Ключ TLS в формате PEM
cert.pem <- Сертификат TLS в формате PEM
(самоподписанный или выданный вашим ЦС)
Начнем создание конфигурации, где основным вторым фактором будет мессенджер Telegram. Измените параметры в соответствии с вашей настройкой.
#MULTIPLE_SERVICES
TIMEZONE=Europe/Belgrade
HOST=0.0.0.0
SERVE_TLS=1
DB_URL=mongodb://mongo:27017
AUDIT_DB_NAME=adf_audit
USERS_DB_NAME=adf
TGOTP_DB_NAME=tgotp
SYSLOGADDR=log:24224
# tgbot+adf_admin
TG_BOT_NAME=my_telegram_bot
# ADF_ADMIN
JWT_SECRET=apha6iedoh0meev2Shagie6xi7ohn7oequichaifahtieNg4vah5peuwohhei8di
CERT_PATH=default/cert.pem
KEY_PATH=default/key.pem
MAILER_HOST=mail.my-mail-domain.tld
MAILER_USER=adf@my-mail-domain.tld
MAILER_PASS=**my-mail-server-password**
# Optional mailer restrictions (messages would be only sent there):
MAILER_RESTRICTIONS="^[^@]+@my-mail-domain.tld\$"
#TGOTPBOT
# following options are tgbot API creds for admin/auth/radius
TGBOT_USER=bot
TGBOT_PASS=bot
TG_API_KEY=123456789:my-telegram-bot-secret-api-key
# log
DB_SHARDED=1
LOGLEVEL=info
SYSLOGPROTO=udp
SYSLOGADDR=log:24224
# If we need to forward copy of logs to remote server
#REMOTE_SYSLOG_HOST=10.0.0.2
#REMOTE_SYSLOG_PORT=1999
#REMOTE_SYSLOG_PROTO=tcp
#radius
RADIUS_SECRET=some-radius-secret
TGBOT_URI=https://tgotpbot:8643
AUTH_API_URI=https://adfadmin:3443
RADIUS_SERVER=radius:1817
LOGFORMAT=json
# only if you intend to use selfservice:
SELFSERVICE_SECRET: "64 byte random secret"
В файле конфигурации вы можете вызвать общие параметры из файла .env, используя один из форматов:
OPTION: "{SHARED_OPTION_NAME}"
or
OPTION: ${SHARED_OPTION_NAME}
оба формата допустимы.
Создадим новую конфигурацию:
adfadmin:
SECRET:
JWT_SECRET: "{JWT_SECRET}"
MAILER_PASS: "{MAILER_PASS}"
TGBOT_USER: ${TGBOT_USER}
TGBOT_PASS: ${TGBOT_PASS}
# only if you intend to use selfservice:
# SELFSERVICE_SECRET: ${SELFSERVICE_SECRET}
VAR:
TZ: ${TIMEZONE}
MONGO_URI: "{DB_URL}"
# host - host for HTTPs server to listen. Default: 0.0.0.0
HOST: ${HOST}
# port - port for HTTPs server to listen. int. Default: 8643
# PORT: 8643
AUDIT_DB_NAME: ${AUDIT_DB_NAME}
USERS_DB_NAME: ${USERS_DB_NAME}
TGOTP_DB_NAME: ${TGOTP_DB_NAME}
# https_key - private key in pem format location.
# Default: ./etc/cert/key.pem
KEY_PATH: ${KEY_PATH}
# https_cert - certificate in pem format location.
# Default: ./etc/cert/cert.pem
CERT_PATH: ${CERT_PATH}
# tg_bot_name - telegram bot name w/o @.
TG_BOT_NAME: ${TG_BOT_NAME}
TG_API_URL: ${TG_API_URL}
# source_login - login for OTP submission.
SOURCE_LOGIN: ${TGBOT_USER}
SYSLOGADDR: ${SYSLOGADDR}
# Variable INIT_user is necessary to create/reset
# 'adfadmin' and 'test' users.
# Uncomment and set to "true" for one time, then revert back.
# INIT_user: "true"
tgotpbot:
SECRET:
# tg_api_key - telegram API key from BotFather.
# Mandatory, no working default value.
TG_API_KEY: ${TG_API_KEY}
RADIUS_SECRET: ${RADIUS_SECRET}
# source_password- password for OTP submission. Default: hag
SOURCE_PASSWORD: ${TGBOT_PASS}
VAR:
TZ: ${TIMEZONE}
# tg_bot_name - telegram bot name w/o @. Default: PSOTPBot
TG_BOT_NAME: ${TG_BOT_NAME}
# source_login - login for request submission.
SOURCE_LOGIN: ${TGBOT_USER}
OTP_LIFETIME: 120
LOGLEVEL: info
LOGFORMAT: json
SYSLOGADDR: ${SYSLOGADDR}
SYSLOGPROTO: udp
# If exposed to outer network, user:pass is mandatory.
# If docker overlay network is used without exposure
# use user:pass at own discretion.
MONGO_URI: "{DB_URL}"
log:
VAR:
TZ: ${TIMEZONE}
DB_URL: ${DB_URL}
DB_SHARDED: ${DB_SHARDED}
radius:
SECRET:
RADIUS_SECRET: ${RADIUS_SECRET}
# If you plan to use EAP
#DOMAIN_USER: "domain_user"
#DOMAIN_LDAP_USER: "CN=ldap,CN=Users,DC=domain,DC=local"
#DOMAIN_PASS: "domain_password"
TGBOT_USER: ${TGBOT_USER}
TGBOT_PASS: ${TGBOT_PASS}
VAR:
TZ: ${TIMEZONE}
TGBOT_OTP_MESSAGE: "Your OTP: "
ADC_HOST: "host.domain.local"
DOMAIN_NAME: "domain.local"
ADC_REALM: "DOMAIN.LOCAL"
DOMAIN_OU: "dc=domain,dc=local"
WORKGROUP: "DOMAIN"
ADC_IP: "10.0.0.3"
RADIUS_LDAP_FILTER: "(&(objectCategory=person)(objectClass=user)
( | (userprincipalname=%{User-Name})
(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})
))"
RADIUS_LDAP_TGBOT_DYNAUTH_FILTER: "(&(objectCategory=person)
(objectClass=user)
( | (userprincipalname=%{User-Name})
(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})
))"
TGBOT_NAS_IP_PREFIX: "System_at_"
Необходимо смотнтировать в контейнер conf ключ и сертификат:
/opt/conf/cert/cert.pem
/opt/conf/cert/key.pem
при этом потребуется добавить сертификат ЦС, которым подписан этот сертификат, в доверенные в каждый из контейнеров