Установка бинарника envoy в systemd

Описание установки envoy в systemd в изолированной среде.

1. Скачивание бинарника из github в Nexus

  1. Создайте временный каталог:

    mkdir -p ~/tmp
    temp_dir=$(mktemp -d ~/tmp/tmpdir.XXXXXX)
    cd $temp_dir
  2. Скачайте архив с бинарником последней версии и файл с контрольными суммами:

    GITHUB_REPO_NAME="envoyproxy/envoy"
    FILES=("envoy-contrib-.*-linux-x86_64" "checksums.txt.asc")
    
    
    for i in ${FILES[@]}; do
      curl -s https://api.github.com/repos/${GITHUB_REPO_NAME}/releases | \
      grep browser_download_url | \
      grep "$i" \
      | head -n1 | cut -d '"' -f 4 | \
      wget -i -
    done
  3. Проверьте подпись и контрольные суммы. Из-за неподходящей структуры файла checksums.txt.asc сравните контрольные суммы вручную:

    gpg --verify checksums.txt.asc
    Проверка не прошла из-за отсутствия на машине нужного ключа.
    gpg: Signature made Ср 07 мая 2025 22:23:57 MSK
    gpg:                using RSA key 0AFCE836BA4D1D35763C8523D8CDC3750181F31F
    gpg: Can't check signature: No public key
    Добавьте отсутствующий gpg-ключ, проверьте подпись файла, расшифруйте и повторите проверку контрольной суммы.
    gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 0AFCE836BA4D1D35763C8523D8CDC3750181F31F
    
    gpg --verify checksums.txt.asc
    
    gpg --decrypt checksums.txt.asc > checksums.txt
    
    awk '{ n=split($2,a,"/"); print $1, a[n] }' checksums.txt > stripped.txt
    
    sha256sum -c --ignore-missing stripped.txt
    Пример ожидаемого вывода:
    envoy-contrib-1.34.1-linux-x86_64: OK
  4. Задайте адрес загрузки файлов:

    INTERNAL_REPO="https://nexus.example.org/repository/github"
    REPO_FOLDER="${GITHUB_REPO_NAME}"
  5. Задайте учётные данные для доступа к локальному репо:

    set +o history
    USER_PASS='ken:xxxxxxxxxxxxxxxx'
    set -o history
  6. Загрузите файлы в Nexus:

    for i in "$FILES[@]"; do
      curl -v --user "${USER_PASS}" \
      --upload-file ${i} \
      ${INTERNAL_REPO}/${REPO_FOLDER}/
    done
  7. Удалите временный каталог:

    cd
    rm -rf ${temp_dir}


2. Установка envoy в systemd

  1. Добавьте системного пользователя:

    useradd -s /sbin/nologin -M -r -U envoy
  2. Добавьте каталог для конфигурационных файлов envoy:

    CONF_DIR='/etc/envoy'
    mkdir -p ${CONF_DIR}
    chown root:envoy ${CONF_DIR}
    chmod 2750 ${CONF_DIR}
  3. Добавьте systemd-юнит:

    cat << 'EOF' > /etc/systemd/system/envoy.service
    [Unit]
    Description=Envoy Proxy Service
    After=network.target
    Wants=network-online.target
    
    [Service]
    Environment=PATH=/usr/local/bin:/usr/bin:/bin
    WorkingDirectory=/etc/envoy
    ExecStart=envoy -c envoy.yaml --service-node node1
    Restart=on-failure
    RestartSec=5s
    
    # Безопасность и изоляция
    User=envoy
    Group=envoy
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SYS_RESOURCE
    AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_SYS_RESOURCE
    NoNewPrivileges=yes
    PrivateTmp=yes
    ProtectSystem=full
    ProtectHome=yes
    ProtectKernelTunables=yes
    ProtectKernelModules=yes
    ProtectKernelLogs=yes
    ProtectControlGroups=yes
    RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
    RestrictNamespaces=yes
    MemoryDenyWriteExecute=yes
    LockPersonality=yes
    RemoveIPC=yes
    PrivateDevices=yes
    PrivateUsers=yes
    PrivateMounts=yes
    
    # Ограничение путей
    ReadOnlyPaths=/etc/envoy
    ReadWritePaths=/var/log/envoy
    ReadWritePaths=/var/run/envoy
    TemporaryFileSystem=/tmp:ro
    
    # Фильтрация системных вызовов
    SystemCallArchitectures=native
    SystemCallFilter=~@resources @debug @raw-io @module @mount
    
    # Логирование
    StandardOutput=journal
    StandardError=inherit
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    systemctl daemon-reload