콘텐츠로 이동

정책 서버 배포와 운영

aigo-policy-server는 조직의 서명된 엔터프라이즈 정책을 제공하는 중앙 서빙 스파인이다. 조직의 비공개 Ed25519 서명 키를 보관하고, 모든 데스크톱·헤드리스 클라이언트가 공개 신뢰 앵커만으로 검증하는 서명된 정책을 서빙하며, 기기 등록을 처리한다.

정책 서버는 서버 측 비공개 구성요소다. aigo-server(추론 서버) 및 데스크톱 앱과는 의도적으로 분리된 산출물이며, 클라이언트에 번들로 포함되지 않는다. 서명 키와 작성한 정책을 모든 사용자·추론 노드에 배포되는 산출물 밖에 두는 것은 최소 권한 원칙이다. 서명 키는 신뢰의 뿌리이므로, 운영자가 직접 운용하는 정책 서버에만 둔다.

정책 문서 스키마(정책이 무엇을 지정·잠금·게이팅할 수 있는지)는 정책 스키마 레퍼런스를 참고한다. 이 문서는 서버 운영을 다룬다.

정책 서버가 하는 일

서버의 역할은 네 개의 경로 묶음으로 나뉜 하나의 임무다.

  • 일회용 등록 토큰을 검증하고 공개 신뢰 앵커와 폴링 메타데이터를 반환해, 새 기기가 이후 정책을 검증할 수 있게 한다.
  • 현재 서명된 정책을 서빙한다.
  • 폴링 시 전체 다운로드 없이 비교할 수 있도록 정책 id와 발급일만 서빙한다.
  • 서명된 클라이언트 감사 배치를 수신한다.

제어면은 이 경로를 보호하는 데 필요한 최소 운영자 표면도 제공한다. 최초 관리자 등록, 사용자 이름·비밀번호 세션, API 키 관리다. 정책 쓰기 API는 없다. 정책과 등록 토큰 문서는 프로세스 시작 시 읽으며, 운영자는 새 파일을 검증한 뒤 서비스를 재시작해 갱신한다.

서버는 추론 런타임, continuum-router, 모델 로더를 실행하지 않는다. 정책 스키마와 Ed25519 서명에는 공유 aigo-policy 크레이트를, HTTP 표면에는 헤드리스 서버와 동일한 인증 REST 스택을 재사용한다.

바이너리 설치

릴리스 파이프라인은 Linux x86-64와 ARM64용 단일 바이너리를 비공개 lablup/backend.ai-go 릴리스에만 게시한다. 정책 서버 산출물은 공개 릴리스 저장소, 데스크톱 설치 관리자, 헤드리스 추론 서버 패키지로 복사되지 않는다. 다운로드 도우미를 쓰려면 gh가 비공개 저장소 읽기 권한으로 인증되어 있어야 한다. 도우미는 현재 체크아웃에 고정된 버전을 내려받고 짝이 맞는 SHA-256 사이드카로 검증한다.

gh auth status

./scripts/download-aigo-policy-server.sh \
    --linux-x64 \
    --dest ./dist-policy-server

sudo install -m 0755 \
    ./dist-policy-server/aigo-policy-server-linux-x64 \
    /usr/local/bin/aigo-policy-server

aigo-policy-server --version

ARM64 관리 호스트에서는 --linux-arm64를 쓴다. 스크립트는 --version VERSION도 받으며, 생략하면 스크립트에 고정된 릴리스를 내려받는다.

소스 체크아웃에서 빌드할 수도 있다.

cd src-tauri
cargo build --release \
    -p aigo-policy-server \
    --no-default-features \
    --features policy-server \
    --bin aigo-policy-server

저장소 루트 기준 결과 바이너리는 src-tauri/target/release/aigo-policy-server다. policy-server 기능은 데스크톱 및 headless 제품과 의도적으로 분리돼 있다.

사전 준비

서버를 세우기 전에 다음을 계획한다.

  • 관리 기기가 HTTPS로 도달할 수 있는 호스트(TLS는 서버 앞단의 리버스 프록시나 네트워크 경로에서 종단한다).
  • 비공개 서명 키를 보관할 안전한 위치(정책을 관리하는 운영자에게만 접근을 제한).
  • 작성한 EnterprisePolicy JSON 문서(정책 스키마 레퍼런스 참고).
  • 관리자 계정, 액세스 키, 기기 레지스트리를 보관할 영속 데이터 디렉터리.

서명 키 생성

서명 키는 PKCS#8 v2 Ed25519 키다. 소유자 전용 umask 아래에서 생성하고 안전하게 보관한다.

umask 077
aigo-policy-server --generate-signing-key > policy-signing.pk8.b64

키는 base64로 stdout에 출력된다(사람이 읽는 안내는 stderr로 가므로 리디렉션은 키만 담는다). 이 키는 전체 플릿의 신뢰 뿌리다. 시크릿 매니저나 접근 통제된 파일에 저장하고, 백업하며, 절대 커밋하거나 클라이언트에 두지 않는다.

키를 원시 바이너리 PKCS#8 파일로 보관해도 된다. 서버는 --signing-key-file에서 원시 PKCS#8 문서나 그 base64 텍스트 인코딩을 모두 받는다.

신뢰 앵커 추출과 배포

클라이언트는 공개 신뢰 앵커만으로 서명된 정책을 검증한다. 서명 키에서 앵커를 출력한다.

aigo-policy-server \
    --signing-key-file policy-signing.pk8.b64 \
    --anchor-id org-2026 \
    --print-anchor \
    > trust-anchor.json

이 명령은 JSON 신뢰 앵커(id와 base64 공개 키)를 출력한다. 선택한 --anchor-id는 서빙되는 정책의 anchorId에 기록되며, 클라이언트에 프로비저닝하는 앵커 id와 일치해야 한다.

이 공개 앵커는 프로비저닝 프로필의 trustAnchors에 담아 기기에 배포한다. 기기가 이 서버로 등록하면 서버는 이 키에서 파생한 동일한 앵커를 반환하므로, 갓 등록한 기기가 곧이어 가져오는 정책을 검증할 수 있다. 기기 등록과 신뢰 앵커를 참고한다.

정책 작성과 서명

정책 스키마 레퍼런스에 따라 EnterprisePolicy 문서(예: /etc/aigo/policy.json)를 작성한다. 서버는 시작 시 정책에 서명하거나, 이미 서명된 문서를 그대로 서빙할 수 있다.

최소 정책에는 스키마 버전, 고유 정책 id, 발급 시각, 이그레스의 두 필수 플래그가 필요하다. 다음 예시는 원격 접근도 끄고 잠근다.

{
  "schemaVersion": 1,
  "policyId": "acme-baseline-2026-09-01-01",
  "issuedAt": "2026-09-01T00:00:00Z",
  "egress": {
    "enforce": false,
    "audit": true
  },
  "settingsOverrides": {
    "advanced": {
      "enableRemoteAccess": false
    }
  },
  "lockedPaths": [
    "advanced.enableRemoteAccess"
  ]
}

서명 키로 작성한 정책을 시작 시 서명한다.

aigo-policy-server \
    --signing-key-file /etc/aigo/policy-signing.pk8 \
    --policy-file /etc/aigo/policy.json \
    --anchor-id org-2026

서명된 SignedPolicy 문서를 그대로 서빙한다(런타임에 서명 키가 필요 없으며, 더 격리된 별도 호스트에서 서명할 때 유용하다).

aigo-policy-server --signed-policy-file /etc/aigo/signed-policy.json

--policy-file--signed-policy-file은 상호 배타적이다. 서명 키는 AIGO_POLICY_SIGNING_KEY(base64)나 AIGO_POLICY_SIGNING_KEY_FILE로도 줄 수 있다. 키는 절대 네트워크로 읽지 않는다.

리스너를 열지 않고 전체 시작 입력을 검증하려면 --dry-run을 쓴다. 정책 파싱, 스키마 지원 범위, 키 서명, 등록 토큰 입력, 공유 서버 구성, 데이터 디렉터리 생성을 확인하고 종료한다.

aigo-policy-server \
    --host 127.0.0.1 \
    --port 8444 \
    --data-dir /var/lib/aigo-policy-server \
    --signing-key-file /etc/aigo/policy-signing.pk8 \
    --policy-file /etc/aigo/policy.json \
    --anchor-id org-2026 \
    --enrollment-tokens-file /etc/aigo/enrollment-tokens.json \
    --dry-run

작성한 정책은 시작 시 한 번 읽고 서명한다. 프로세스가 실행 중일 때 policy.json을 바꿔도 서빙되는 정책은 달라지지 않는다. 갱신할 때마다 새 policyId를 부여하고 issuedAt을 갱신한 뒤 --dry-run, 파일 설치, 서버 재시작 순으로 진행한다. 클라이언트는 policyId를 버전 키로 사용하므로, 다른 필드나 issuedAt이 바뀌어도 id가 같으면 전체 정책 다운로드를 생략한다.

기기 등록 구성

등록은 일회용 토큰을 하나 이상 구성할 때만 제공된다. 각 토큰은 일회용이다. 첫 등록 성공 시 소비되며 재사용할 수 없다. 토큰 문서에서 각 토큰을 선택적 조직 레이블에 매핑한다.

--enrollment-token은 제거되었다

이전 버전은 명령줄에서 --enrollment-token TOKEN[:ORG]을 받았다. 이 플래그는 사라졌다. 등록 토큰은 bearer 비밀이고, 유닉스에서 프로세스 인자는 /proc/<pid>/cmdline, ps, 셸 히스토리, 컨테이너 inspect 출력을 통해 같은 머신의 모든 계정이 읽을 수 있다. 즉 명령줄로 넘기는 순간 공개된 것이다. 서버는 이 플래그를 여전히 인식하되 아래 대체 수단을 알려주며 시작을 거부한다. 예전 init 스크립트가 조용히 등록 없이 서비스되는 대신 눈에 띄게 실패하도록 하기 위해서다.

토큰을 조직 레이블에 매핑하는 JSON 문서를 파일, 환경변수, 표준 입력 중 하나로 준다(null은 조직 없이 묶음). 토큰은 평문으로 로그에 남지 않는다.

{
  "tok-alice": "acme",
  "tok-bob": "acme",
  "tok-guest": null
}
chmod 600 /etc/aigo/enrollment-tokens.json

aigo-policy-server \
    --signing-key-file /etc/aigo/policy-signing.pk8 \
    --policy-file /etc/aigo/policy.json \
    --anchor-id org-2026 \
    --enrollment-tokens-file /etc/aigo/enrollment-tokens.json \
    --poll-interval-secs 900

이 파일은 소유자 외에는 읽을 수 없어야 한다. 그룹이나 전체가 읽을 수 있는 토큰 파일(또는 서명 키)은 경고가 아니라 시작 실패로 처리한다. 경고를 놓친 운영자는 비밀이 노출된 채 계속 서비스하게 되기 때문이다.

토큰을 파일 시스템에 두고 싶지 않다면 같은 문서를 AIGO_POLICY_ENROLLMENT_TOKENS로 넘기거나, --enrollment-tokens-stdin으로 표준 입력에 파이프한다.

vault kv get -field=tokens secret/aigo/enrollment \
  | aigo-policy-server \
      --signing-key-file /etc/aigo/policy-signing.pk8 \
      --policy-file /etc/aigo/policy.json \
      --anchor-id org-2026 \
      --enrollment-tokens-stdin

세 경로는 파일, 환경변수, 표준 입력 순으로 병합된다. 시작 시 한 번만 읽는다. 토큰을 추가하거나 제거한 뒤에는 새 토큰을 기기에 전달하기 전에 서비스를 재시작한다.

소비된 토큰과 등록된 기기는 데이터 디렉터리의 device-registry.json에 기록되며, 모드 0600으로 원자적으로 쓰인다. 따라서 재시작해도 이미 쓴 토큰이 다시 유효해지지 않고, 등록된 기기 목록도 유실되지 않는다. 소비된 토큰은 SHA-256 다이제스트로 저장되므로 이 파일이 토큰 목록의 두 번째 사본이 되지는 않는다. 데이터 디렉터리 전체를 영속 저장소에 두고 서버 백업·복구 계획에 포함한다. 이 디렉터리에는 users.db와 암호화된 액세스 키 저장소도 있다.

설정한 폴 간격(--poll-interval-secs, 기본 900)은 기기에 반환되어, 갱신된 정책을 얼마나 자주 폴링할지 정한다. 등록 토큰을 구성하지 않으면 등록이 제공되지 않고 POST /api/v1/enroll503을 반환한다.

서버 시작과 운영자 접근 부트스트랩

명시적인 영속 데이터 디렉터리를 사용한다. 같은 호스트의 리버스 프록시를 쓴다면 정책 서버는 루프백에 바인딩하고, 첫 관리자를 만들 때까지 프록시를 비활성화한다.

aigo-policy-server \
    --host 127.0.0.1 \
    --port 8444 \
    --data-dir /var/lib/aigo-policy-server \
    --signing-key-file /etc/aigo/policy-signing.pk8 \
    --policy-file /etc/aigo/policy.json \
    --anchor-id org-2026 \
    --enrollment-tokens-file /etc/aigo/enrollment-tokens.json \
    --no-socket

기본 바인딩 주소는 127.0.0.1, 기본 포트는 8444다. --no-socket은 선택 사항이다. 이 TCP 전용 배포에서 소유자 전용 Unix 소켓을 함께 열지 않게 한다.

관리자 계정이 필요한지 확인한다.

curl -fsS http://127.0.0.1:8444/api/v1/setup/status

첫 관리자는 로컬에서 만든다. 다음 명령은 비밀번호를 프로세스 인자와 셸 히스토리에 남기지 않고, 반환된 세션 쿠키를 소유자 전용 파일에 저장한다.

umask 077
read -r -s -p "Admin password: " AIGO_ADMIN_PASSWORD
printf '\n'

printf '%s' "$AIGO_ADMIN_PASSWORD" \
  | jq -Rs '{username: "admin", password: .}' \
  | curl -fsS \
      -c admin.cookies \
      -H 'Content-Type: application/json' \
      --data-binary @- \
      http://127.0.0.1:8444/api/v1/setup/register-admin

unset AIGO_ADMIN_PASSWORD

루프백 리스너는 호스트에서만 엔드포인트에 접근할 수 있으므로 설정 토큰을 요구하지 않는다. 이 단계를 마치기 전에 리버스 프록시를 공개하지 않는다. 관리자 계정이 없는 상태에서 서버를 비루프백 주소에 바인딩하면, 서버는 생성한 st-... 설정 토큰을 stderr에 한 번 출력한다. 등록 요청 본문의 setupToken으로 이 값을 전달한다. 등록 전 재시작하면 다른 토큰이 생성된다.

등록 응답은 관리자 세션을 만든다. 이 세션으로 모니터링과 운영 점검용 최소 권한 API 키를 만든다.

curl -fsS \
    -b admin.cookies \
    -H 'Content-Type: application/json' \
    --data-binary '{
      "name": "policy-monitor",
      "description": "Policy version monitoring",
      "scopes": ["enterprise_read"],
      "rateLimit": 0,
      "createdBy": "admin"
    }' \
    http://127.0.0.1:8444/admin/keys

응답은 새 비밀을 data.secret에 한 번만 반환한다. 시크릿 매니저에 저장한다. 이후 목록과 읽기 동작은 마스킹된 키만 반환한다. 관리자 세션은 메모리에 있으므로 재시작하면 사라지지만, 관리자 계정과 API 키는 데이터 디렉터리에 유지된다. 새 세션이 필요하면 POST /api/v1/auth/login으로 다시 로그인한다.

HTTP 표면

서버는 --host(기본 127.0.0.1, 환경변수 AIGO_POLICY_HOST)와 --port(기본 8444, 환경변수 AIGO_POLICY_PORT)로 바인딩한다. 기본 포트는 헤드리스 aigo-server 기본값(8001)과 다르므로, 정책 서버와 추론 서버가 한 머신을 공유할 수 있다. 인증은 끌 수 없다. 서버는 auth.require_api_key=false를 덮어쓴다. 정책·감사 경로가 enterprise_read 스코프 검사 전에 기기 서명 검증에 의존하기 때문이다.

이 제품이 마운트하는 전체 경로 묶음은 다음과 같다.

묶음 경로 인증 용도
기기 등록 POST /api/v1/enroll 요청 본문의 일회용 등록 토큰 토큰을 검증·소비하고 신뢰 앵커와 폴 간격을 반환한다.
정책 GET /api/v1/policy, GET /api/v1/policy/version, POST /api/v1/audit enterprise_read, 등록 기기는 각 요청을 기기 키로 서명 서명된 정책과 버전 메타데이터를 서빙하고, 서명된 기기 감사 배치를 받는다.
최초 설정과 로그인 GET /api/v1/setup/status, POST /api/v1/setup/register-admin, /api/v1/auth/{validate,scopes,session,login,logout} 공개 부트스트랩 경로, 각 핸들러에서 자격 증명을 검사 첫 관리자를 만들고, 운영자 로그인·로그아웃과 자격 증명·스코프 조회를 처리한다.
계정 GET /api/v1/auth/me, POST /api/v1/auth/password 인증된 사용자 이름·비밀번호 세션 현재 계정을 읽고 비밀번호를 바꾼다.
API 키 관리 /admin/keys, /admin/keys/audit, 키별 읽기·수정·삭제·교체·활성화·비활성화·감사 경로 keys_read 또는 keys_write 운영자 API 키를 발급하고 관리한다.

기기 서명 인증은 등록 기기에 좁은 enterprise_read 스코프를 부여한다. 운영자·관리자 흐름에는 API 키와 세션 인증을 계속 쓸 수 있다. 클라이언트 감사 보고는 감사와 컴플라이언스에서 다룬다.

모델, 추론, 라우터, 에이전트, 플러그인, 메모리, 파일, 메트릭, 피어 경로는 마운트하지 않는다. 이런 요청은 404를 반환한다. 추론 제품에는 aigo-server를 사용한다.

서비스로 실행하기(systemd)

장애 시 재시작하고 부팅 시 시작하도록 서비스 관리자 아래에서 서버를 실행한다. 유닛을 로드하기 전에 전용 계정을 만들고, 런타임이 실제로 허용하는 권한으로 입력 파일을 설치하며, 영속 데이터 디렉터리를 만든다.

sudo useradd --system --home-dir /var/lib/aigo-policy-server \
    --shell /usr/sbin/nologin aigo

sudo install -d -o root -g root -m 0755 /etc/aigo
sudo install -d -o aigo -g aigo -m 0700 /var/lib/aigo-policy-server
sudo install -o aigo -g aigo -m 0600 \
    policy-signing.pk8.b64 /etc/aigo/policy-signing.pk8
sudo install -o aigo -g aigo -m 0600 \
    enrollment-tokens.json /etc/aigo/enrollment-tokens.json
sudo install -o root -g root -m 0644 \
    policy.json /etc/aigo/policy.json

aigo 계정이 이미 있다면 useradd는 생략한다. 두 비밀 파일은 서비스 계정 소유, 모드 0600이어야 한다. root 소유의 모드 0600 파일은 User=aigo가 읽을 수 없고, 0640처럼 그룹이 읽을 수 있는 모드는 서버가 의도적으로 거부한다.

아래 유닛은 같은 호스트의 TLS 리버스 프록시를 위해 루프백에만 바인딩하고, 사용하지 않는 Unix 소켓을 끈다. 프로세스는 /etc/aigo를 읽기 전용으로 보고 영속 상태 디렉터리만 쓸 수 있다.

[Unit]
Description=Backend.AI GO Policy Server
Documentation=https://github.com/lablup/backend.ai-go
After=network-online.target
Wants=network-online.target
RequiresMountsFor=/var/lib/aigo-policy-server

[Service]
Type=simple
User=aigo
Group=aigo
UMask=0077
ExecStart=/usr/local/bin/aigo-policy-server \
    --host 127.0.0.1 \
    --port 8444 \
    --data-dir /var/lib/aigo-policy-server \
    --signing-key-file /etc/aigo/policy-signing.pk8 \
    --policy-file /etc/aigo/policy.json \
    --anchor-id org-2026 \
    --enrollment-tokens-file /etc/aigo/enrollment-tokens.json \
    --no-socket

NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictAddressFamilies=AF_INET AF_INET6
RestrictNamespaces=true
LockPersonality=true
RestrictRealtime=true
RestrictSUIDSGID=true
ReadOnlyPaths=/etc/aigo
ReadWritePaths=/var/lib/aigo-policy-server
CapabilityBoundingSet=
AmbientCapabilities=

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

/etc/systemd/system/aigo-policy-server.service로 저장한 뒤 서비스를 시작하고, 리버스 프록시를 활성화하기 전에 로컬 관리자 부트스트랩을 마친다.

sudo systemctl daemon-reload
sudo systemctl enable --now aigo-policy-server
sudo systemctl status aigo-policy-server
journalctl -u aigo-policy-server -f

데이터 디렉터리는 일회용이 아니다. 관리자 데이터베이스, 액세스 키, 소비된 토큰 다이제스트, 등록 기기 공개 키를 담는다. /tmp 아래에 두지 않는다. ProtectHome=true를 쓰면서 --data-dir을 생략해서도 안 된다. 대체 경로는 서비스 계정 홈 아래에 있고 이 샌드박스 설정이 가린다.

프로세스는 정상 종료를 위해 SIGTERM을 처리하지만 구성 재적재는 구현하지 않는다. 검증된 정책이나 토큰 문서를 바꾼 뒤 systemctl restart aigo-policy-server를 사용한다. SIGHUP을 보내는 ExecReload를 추가하지 않는다.

컨테이너로 실행하기

프로젝트는 공식 정책 서버 컨테이너 이미지를 게시하지 않는다. 지원되는 릴리스 산출물은 단일 Linux 바이너리이므로, 컨테이너가 필요한 운영자는 버전이 일치하는 바이너리로 비공개 이미지를 빌드하고 유지해야 한다. 최소 기반 이미지에는 CA 인증서와 상태 점검 클라이언트가 필요하다. 서버는 비루트 사용자로 실행하고 영속 쓰기 가능 데이터 볼륨을 사용한다.

FROM ubuntu:24.04

RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates curl \
    && rm -rf /var/lib/apt/lists/* \
    && useradd --uid 10001 --user-group --no-create-home \
        --home-dir /var/lib/aigo-policy-server \
        --shell /usr/sbin/nologin aigo \
    && install -d -o aigo -g aigo -m 0700 /var/lib/aigo-policy-server

COPY --chown=aigo:aigo --chmod=0755 \
    aigo-policy-server /usr/local/bin/aigo-policy-server

USER 10001:10001

ENTRYPOINT ["/usr/local/bin/aigo-policy-server", "--host", "0.0.0.0", "--port", "8444", "--data-dir", "/var/lib/aigo-policy-server", "--no-socket"]

서명 키, 토큰 문서, 정책은 읽기 전용으로 마운트하고 해당 컨테이너 경로를 플래그로 전달한다. 키와 토큰 마운트는 컨테이너 안에서 소유자 10001, 모드 0600으로 보여야 한다. 그룹이나 전체가 읽을 수 있는 일반적인 시크릿 마운트는 거부된다. /var/lib/aigo-policy-server는 영속 볼륨에서 마운트하고, 가능하면 루트 파일 시스템을 읽기 전용으로 두며, 8444 포트는 TLS 종단기에만 공개한다.

enterprise_read 운영자 키를 부트스트랩한 뒤 /run/secrets/policy-health-key 같은 컨테이너 시크릿에 저장하고 저렴한 버전 경로로 상태 점검을 추가한다.

HEALTHCHECK --interval=30s --timeout=5s \
  CMD-SHELL curl -fsS http://localhost:8444/api/v1/policy/version \
      -H "Authorization: Bearer $(cat /run/secrets/policy-health-key)" \
      || exit 1

docker inspect로 확인된 헬스 상태를 조회한다.

docker inspect --format='{{.State.Health.Status}}' aigo-policy-server

배포 검증

서버를 시작한 뒤, 정책을 서빙하는지와 버전 경로가 응답하는지 확인한다. 버전 경로는 가장 저렴한 점검이며 클라이언트가 폴링하는 대상이다.

curl -fsS https://policy.acme.example/api/v1/policy/version \
    -H "Authorization: Bearer <operator-api-key>"

정상 응답은 정책 id(문서의 policyId)와 발급일을 담는다. 클라이언트는 이 id를 캐시된 id와 비교하고, 바뀐 경우에만 전체 정책을 내려받는다.

갱신 시 전체 운영 순서는 다음과 같다.

  1. 작성한 정책이나 사전 서명 정책을 편집하고 새 policyIdissuedAt을 부여한다.
  2. 전체 시작 명령에 --dry-run을 붙여 실행한다.
  3. 새 파일을 구성된 경로에 원자적으로 설치한다.
  4. systemctl restart aigo-policy-server로 서비스를 재시작한다.
  5. /api/v1/policy/version에서 새 id를 확인한 뒤 클라이언트 전파에 한 폴 간격을 둔다.

등록 토큰 입력을 바꾼 뒤에도 같은 재시작 규칙이 적용된다. SIGHUP이나 실시간 파일 재적재는 없다.

명령어 레퍼런스

플래그 환경변수 용도
--signing-key-file AIGO_POLICY_SIGNING_KEY_FILE PKCS#8 Ed25519 서명 키(원시 또는 base64).
--anchor-id AIGO_POLICY_ANCHOR_ID anchorId에 기록되고 클라이언트에 프로비저닝되는 신뢰 앵커 id.
--policy-file AIGO_POLICY_FILE 작성한 EnterprisePolicy JSON, 시작 시 서명.
--signed-policy-file AIGO_POLICY_SIGNED_FILE 서명된 SignedPolicy JSON, 그대로 서빙.
AIGO_POLICY_SIGNING_KEY 환경변수로 직접 전달하는 base64 PKCS#8 Ed25519 서명 키. 시크릿 매니저나 소유자 전용 파일을 권장.
--enrollment-tokens-file AIGO_POLICY_ENROLLMENT_TOKENS_FILE 토큰을 조직에 매핑한 JSON(null은 조직 없음). 모드 0600이어야 한다.
--enrollment-tokens-stdin 토큰-조직 JSON 문서를 표준 입력에서 읽음.
AIGO_POLICY_ENROLLMENT_TOKENS 토큰-조직 JSON 문서를 환경변수로 직접 전달.
--poll-interval-secs AIGO_POLICY_POLL_INTERVAL_SECS 등록 기기에 반환되는 폴 간격(기본 900).
--host / -H AIGO_POLICY_HOST 숫자 바인딩 주소(기본 127.0.0.1).
--port / -p AIGO_POLICY_PORT 바인딩 포트(기본 8444).
--data-dir / -D AIGO_POLICY_DATA_DIR 계정, 액세스 키, 기기 레지스트리를 보관하는 영속 데이터 디렉터리.
--config / -c AIGO_POLICY_CONFIG TOML 설정 파일(aigo-server 설정 형태 재사용).
--print-anchor 공개 신뢰 앵커를 출력하고 종료.
--generate-signing-key 새 base64 PKCS#8 Ed25519 키를 출력하고 종료.
--no-socket Unix 도메인 소켓 리스너 비활성(TCP만).
--dry-run 설정·정책·키를 검증하고 종료.
--verbose / -v 로깅 상세도 증가(-v, -vv).
--quiet / -q 오류 외 출력 억제.

다음 단계