Структура конфигурационного файла

Конфигурация Stronghold Agent описывается в HCL формате:

# Подключение к Stronghold серверу.
stronghold {
  address = "https://stronghold.example.com:8200"
  ca_cert = "/etc/stronghold-agent/ca.pem"
  
  # Настройки retry.
  retry {
    num_retries = 5
  }
}

# Автоматическая аутентификация.
auto_auth {
  method "approle" {
    # ... конфигурация метода.
  }
  
  sink "file" {
    # ... конфигурация sink.
  }
}

# API Proxy (опционально).
api_proxy {
  use_auto_auth_token = true
}

# Кеширование (опционально).
cache {
  use_auto_auth_token = true
}

# Listener для API Proxy.
listener "tcp" {
  address = "127.0.0.1:8200"
  tls_disable = true
}

# Шаблоны.
template {
  source      = "/path/to/template.ctmpl"
  destination = "/path/to/output"
  # ... дополнительные настройки.
}

# PID файл.
pid_file = "/var/run/stronghold-agent.pid"

# Логирование.
log_level = "info"
log_file = "/var/log/stronghold-agent.log"

Секция vault/stronghold

Для подключения к Stronghold серверу используется имя секции stronghold. Если требуется интеграция с Hashicorp Vault, то следует использовать vault в качестве имени секции.

stronghold {
  # URL сервера (обязательно).
  address = "https://stronghold.example.com:8200"
  
  # TLS настройки.
  ca_cert = "/etc/stronghold-agent/ca.pem"              # CA сертификат.
  ca_path = "/etc/stronghold-agent/ca-bundle/"          # Директория с CA.
  client_cert = "/etc/stronghold-agent/client.pem"      # Клиентский сертификат.
  client_key = "/etc/stronghold-agent/client-key.pem"   # Клиентский ключ.
  tls_skip_verify = false                         # Не отключать в продакшене!
  tls_server_name = "stronghold.example.com"      # SNI имя.
  
  # Retry политика,
  retry {
    num_retries = 5  # Количество повторных попыток.
  }
}

Секция auto_auth

Настройка автоматической аутентификации:

auto_auth {
  # Метод аутентификации.
  method "approle" {
    mount_path = "auth/approle"  # Путь монтирования auth метода
    namespace  = "myns"           # Namespace (опционально, для Enterprise)
    
    config = {
      # Параметры специфичные для метода.
      role_id_file_path = "/etc/stronghold-agent/role-id"
      secret_id_file_path = "/etc/stronghold-agent/secret-id"
    }
  }
  
  # Sink - куда сохранять токен (опционально, может быть несколько).
  sink "file" {
    config = {
      path = "/var/run/stronghold-agent/token"
      mode = 0640
    }
  }
  
  # Sink с шифрованием.
  sink "file" {
    wrap_ttl = "5m"                    # Обернуть токен с TTL
    aad_env_var = "VAULT_AAD"          # Дополнительные данные для шифрования
    dh_type = "curve25519"             # Тип Diffie-Hellman
    dh_path = "/etc/stronghold-agent/dh-pub" # Публичный ключ
    
    config = {
      path = "/var/run/stronghold-agent/encrypted-token"
    }
  }
}

Секция template

Настройка рендеринга шаблонов:

template {
  # Путь к файлу шаблона (обязательно).
  source = "/etc/myapp/config.ctmpl"
  
  # Путь к выходному файлу (обязательно).
  destination = "/etc/myapp/config.conf"
  
  # Права доступа к файлу.
  perms = "0600"
  
  # Пользователь и группа.
  user = "myapp"
  group = "myapp"
  
  # Резервная копия перед заменой.
  backup = true
  
  # Команда для выполнения после рендеринга.
  command = "systemctl reload myapp"
  command_timeout = "30s"
  
  # Ожидание перед первым рендерингом.
  wait {
    min = "5s"
    max = "10s"
  }
  
  # Обработка ошибок.
  error_on_missing_key = true
  
  # Рендер только при изменениях.
  create_dest_dirs = true
}

Секция template_config

Глобальные настройки для всех шаблонов:

template_config {
  # Выйти после первого рендеринга всех шаблонов.
  exit_on_retry_failure = false
  
  # Интервал периодического рендеринга «статических» секретов (например KV).
  # Можно задавать строкой длительности (например "5m") или числом секунд.
  static_secret_render_interval = "5m"
}

Секция exec (Process Supervisor)

Запуск дочернего процесса с инжектированными секретами:

exec {
  # Команда для запуска (обязательно)Я.
  command = ["/usr/bin/myapp", "--config", "/etc/myapp/config.yaml"]
  
  # Политика перезапуска при изменении секретов.
  restart_on_secret_changes = "always"  # always, never
  
  # Сигнал для остановки процесса.
  restart_stop_signal = "SIGTERM"
}

# Шаблон для переменных окружения.
env_template "DATABASE_URL" {
  contents = "postgresql://:@db:5432"
  error_on_missing_key = true
}

env_template "API_KEY" {
  contents = ""
  error_on_missing_key = true
}

Секция listener

Настройка HTTP(S) listener для API Proxy:

listener "tcp" {
  address = "127.0.0.1:8200"
  tls_disable = true
  
  # TLS настройки.
  tls_cert_file = "/etc/stronghold-agent/agent-cert.pem"
  tls_key_file = "/etc/stronghold-agent/agent-key.pem"
  
  # Требование специального заголовка.
  require_request_header = true
  
  # Настройки API.
  agent_api {
    enable_quit = true  # Включить /agent/v1/quit endpoint
  }
}

# Unix socket listener
listener "unix" {
  address = "/var/run/stronghold-agent.sock"
  tls_disable = true
  socket_mode = "0660"
  socket_user = "myapp"
  socket_group = "myapp"
}

Логирование и отладка

# Уровень логирования: trace, debug, info, warn, error.
log_level = "info"

# Файл логов.
log_file = "/var/log/stronghold-agent.log"

# Формат логов: standard, json.
log_format = "json"

# Ротация логов.
log_rotate_duration = "24h"
log_rotate_bytes = 104857600  # 100MB
log_rotate_max_files = 10