Airlock Application Service проксирует HTTP/HTTPS-трафик к внутренним веб-приложениям: панелям мониторинга, CI/CD, wiki, Kubernetes Dashboard и другим сервисам, доступным только из частной сети.

Пользователи открывают приложение через веб-интерфейс Airlock или по адресу https://<имя-приложения>.<домен-прокси>.

Предварительные требования

  • Работающий кластер Airlock (Auth + Proxy).
  • DNS-запись *.airlock.example.com, указывающая на Proxy Service (для поддоменов приложений).
  • TLS-сертификат для Proxy Service и wildcard для поддоменов приложений.
  • Хост, Docker-контейнер или Kubernetes для приложения и Application Service.
  • Доступ к airctl.

Шаг 1. Join-токен

airsh login --user=admin --proxy=airlock.example.com
airctl tokens add \
  --type=app \
  --app-name=grafana \
  --app-uri=http://localhost:3000 \
  --format=text > /tmp/token

Шаг 2. Запуск приложения

Пример Grafana в Docker:

docker run --detach --name grafana --publish 3000:3000 grafana/grafana

В grafana.ini укажите домен Proxy Service:

[server]
domain = airlock.example.com

Пример Grafana в Kubernetes:

helm repo add grafana https://grafana.github.io/helm-charts
helm install example-grafana grafana/grafana \
  --create-namespace \
  --namespace example-grafana

Внутренний URI в кластере: http://example-grafana.example-grafana.svc.cluster.local.

Шаг 3. Application Service

Linux / Docker

sudo airlock configure \
  --output=file \
  --proxy=airlock.example.com:443 \
  --token=/tmp/token \
  --roles=app \
  --app-name=grafana \
  --app-uri=http://localhost:3000

sudo systemctl enable --now airlock

Конфигурационный файл

version: v3
airlock:
  data_dir: /var/lib/airlock-app
  auth_token: /tmp/token
  proxy_server: airlock.example.com:443
app_service:
  enabled: yes
  apps:
  - name: grafana
    uri: http://localhost:3000
    public_addr: grafana.airlock.example.com
    labels:
      env: prod
auth_service:
  enabled: "no"
ssh_service:
  enabled: "no"
proxy_service:
  enabled: "no"
sudo airlock start --config=/etc/airlock.yaml

Kubernetes

JOIN_TOKEN=$(cat /tmp/token)
helm install airlock-kube-agent airlock/airlock-kube-agent \
  --create-namespace \
  --namespace airlock-agent \
  --set roles=app \
  --set proxyAddr=airlock.example.com:443 \
  --set authToken=${JOIN_TOKEN} \
  --set "apps[0].name=grafana" \
  --set "apps[0].uri=http://example-grafana.example-grafana.svc.cluster.local" \
  --set "apps[0].labels.env=dev"

Шаг 4. Пользователь и доступ

airctl users add --roles=access appuser

Способы доступа:

  1. Веб-UI Airlock → вкладка Applications → Launch.
  2. Прямой URL: https://grafana.airlock.example.com.

Имя приложения

Имя приложения (--app-name) должно быть допустимым поддоменом: до 63 символов, только a-z, 0-9, -.

После регистрации приложение доступно по адресу <app-name>.<proxy-host>, например grafana.airlock.example.com. Можно переопределить через public_addr в конфигурации.

Дополнительные параметры

Приложение в подкаталоге

- name: k8s-dashboard
  uri: "http://10.0.1.60:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/"
  public_addr: k8s.airlock.example.com

Перезапись redirect

Для приложений с внутренними редиректами:

- name: jenkins
  uri: https://localhost:8001
  public_addr: jenkins.airlock.example.com
  rewrite:
    redirect:
    - localhost
    - jenkins.internal.dev

Self-signed сертификат приложения

- name: app
  uri: https://localhost:8443
  public_addr: app.airlock.example.com
  insecure_skip_verify: true

Не рекомендуется для production.

Заголовки и JWT

Airlock может добавлять заголовки к запросам, в том числе JWT с информацией о пользователе:

- name: dashboard
  uri: https://localhost:4321
  public_addr: dashboard.airlock.example.com
  rewrite:
    headers:
    - "Authorization: Bearer {{internal.jwt}}"

Выход из приложения

Принудительный выход до истечения сессии:

https://grafana.airlock.example.com/airlock-logout

TCP-приложения

Для приложений без HTTP (plain TCP) используйте TCP App Access — укажите протокол TCP в конфигурации Application Service.

Политики доступа

Доступ к приложениям настраивается через RBAC (app_labels в ролях). См. Политики доступа.