Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
iron-proxy — 신뢰할 수 없는 워크로드를 위한 이그레스 방화벽. | Kitploit
도구/GitHubGitHub/paradigmxyz/iron-proxy
Container SecurityWeb Proxies & InterceptionData ExfiltrationWeb SecurityNetwork SecurityCloud SecurityDevSecOpsDatabase Security
GitHubparadigmxyz/iron-proxy

iron-proxy

신뢰할 수 없는 워크로드를 위한 이그레스 방화벽.

저장소 보기
61236276일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

iron-proxy

Docs Latest Release Docker Pulls

The problem

CI 작업, AI 코딩 에이전트 및 샌드박스 컨테이너는 임의의 아웃바운드 요청을 만들 수 있습니다. 손상된 의존성, 프롬프트 인젝션 또는 악성 빌드 단계는 비밀을 유출하고, 외부로 통신(phone home)하거나, 리버스 셸을 열 수 있습니다. 대부분의 팀은 워크로드에서 나가는 트래픽을 전혀 볼 수 없으며, 이를 막을 방법은 더더욱 없습니다.

What iron-proxy does

iron-proxy는 신뢰할 수 없는 워크로드와 인터넷 사이에 위치하는 MITM 이그레스 프록시이며, 내장 DNS 서버를 포함합니다. 네트워크 경계에서 기본 거부(default-deny)를 적용하므로 워크로드는 명시적으로 허용한 도메인에만 접근할 수 있습니다. 실제 비밀은 샌드박스에 절대 들어가지 않습니다. 워크로드는 프록시 토큰을 사용하고, iron-proxy는 이그레스 시점에 실제 자격 증명으로 교체합니다. 즉, 손상된 워크로드는 프록시 외부에서 가치가 없는 토큰을 유출할 수 있습니다.

단일 바이너리. 단일 YAML 구성.

  • 기본 거부 이그레스. 대상이 허용 목록과 일치하지 않는 모든 아웃바운드 요청은 차단됩니다. 도메인과 CIDR을 나열하면 그 외의 모든 요청은 403을 받습니다.
  • 업스트림 IP 거부 목록. 호스트가 허용된 경우에도, 해석된 주소가 거부된 CIDR 안에 있으면 프록시는 해당 호스트로의 연결을 거부합니다 — 허용된 호스트 이름이 IMDS나 루프백을 가리킬 때 발생하는 SSRF/DNS-리바인딩 허점을 차단합니다. 클라우드 메타데이터 엔드포인트(169.254.169.254, fd00:ec2::254, fd20:ce::254)와 루프백은 기본적으로 거부되며, proxy.upstream_deny_cidrs 또는 IRON_PROXY_UPSTREAM_DENY_CIDRS로 재정의할 수 있습니다.
  • 경계 수준 비밀 주입. 워크로드는 프록시 토큰을 보내고, iron-proxy는 요청이 나가기 전에 이를 실제 비밀로 교체합니다. 샌드박스가 손상되면 공격자는 프록시 외부에서 쓸모없는 토큰을 얻게 됩니다.
  • 요청별 감사 추적. 모든 요청은 전체 변환 파이프라인 결과와 함께 구조화된 JSON으로 기록됩니다: 교체된 비밀, 일치한 규칙, 차단된 항목과 그 이유가 포함됩니다.
  • 스트리밍 지원. WebSocket 업그레이드와 Server-Sent Events는 기본적으로 프록시 처리됩니다. 장기 연결을 유지하는 에이전트 워크로드를 위한 특별한 구성은 필요하지 않습니다.
  • 명시적 프록시 지원. HTTP_PROXY, HTTPS_PROXY 또는 SOCKS5 설정을 통해 프록시 구성을 기본 지원하는 도구를 위한 선택적 터널 리스너입니다.
  • PostgreSQL MITM 프록시. 클라이언트를 프록시 관리 자격 증명으로 인증하고, 업스트림 세션에 SET ROLE을 주입하며, SQL AST 탐색을 통해 클라이언트가 역할을 변경하려는 시도(SET ROLE, set_config('role', ...), DO 블록 등)를 거부하는 선택적 리스너입니다. 애플리케이션이 공유 서비스 계정 사용자로 연결할 때 PostgreSQL 행 수준 보안과 함께 사용하여 테넌트별 데이터 격리를 제공합니다. PgBouncer를 사용하는 경우 pool_mode = session으로 실행해야 합니다 — 트랜잭션 또는 명령문 풀 모드는 쿼리 사이에 백엔드를 자동으로 다시 바인딩하여 정책을 무력화합니다. 자세한 내용은 docs.iron.sh를 참조하세요.

CI 파이프라인, GitHub Actions, AI 에이전트(Claude Code, Cursor, Codex) 및 완전히 신뢰할 수 없는 코드를 실행하는 모든 환경을 위해 만들어졌습니다.

차단된 유출 + 비밀 재작성 동작:

Installation

Docker 이미지는 Docker Hub에서 사용할 수 있으며, Linux/macOS(amd64/arm64)용 사전 빌드 바이너리는 GitHub Releases에서 제공됩니다.

또는 소스에서 빌드:```bash go build -o iron-proxy ./cmd/iron-proxy

root@kitploit:~
## 빠른 시작```bash
cd examples/docker-compose
docker compose up

이것은 iron-proxy와 데모 클라이언트를 시작하며, 데모 클라이언트는 프록시를 통해 다섯 개의 요청을 보냅니다. 허용된 요청, 차단된 요청, 비밀이 재작성된 요청을 확인하려면 로그를 확인하세요:```bash docker compose logs proxy

root@kitploit:~
모든 요청은 구조화된 JSON 감사 항목을 생성합니다:```json
{
  "host": "httpbin.org",
  "method": "GET",
  "path": "/headers",
  "action": "allow",
  "status_code": 200,
  "duration_ms": 142,
  "request_transforms": [
    { "name": "allowlist", "action": "continue" },
    {
      "name": "secrets",
      "action": "continue",
      "annotations": { "swapped": [{ "secret": "OPENAI_API_KEY", "locations": ["header:Authorization"] }] }
    }
  ]
}

거부된 요청에는 rejected_by 필드가 포함되며 WARN 수준으로 기록됩니다. 전체 스키마는 감사 로그 형식을 참조하세요.

프로덕션 사용

1. CA 생성

iron-proxy는 사용자가 제공한 CA가 서명한 리프 인증서를 즉석에서 생성하여 TLS를 종료합니다. 클라이언트 컨테이너는 이 CA를 신뢰해야 합니다.```bash mkdir -p certs openssl genrsa -out certs/ca.key 4096 openssl req -x509 -new -nodes
-key certs/ca.key
-sha256 -days 3650
-subj "/CN=iron-proxy CA"
-addext "basicConstraints=critical,CA:TRUE"
-addext "keyUsage=critical,keyCertSign"
-out certs/ca.crt

root@kitploit:~
### 2. Docker 네트워크 생성

iron-proxy는 컨테이너가 DNS를 지정할 수 있도록 고정 IP가 필요합니다:```bash
docker network create --subnet=172.20.0.0/24 iron-proxy

3. iron-proxy 시작

비밀 정보가 담긴 env 파일을 만드세요 (버전 관리에서 제외하세요):```bash echo "OPENAI_API_KEY=sk-real-key" > .env

root@kitploit:~
[No input content provided to translate.]```bash
docker run -d --name iron-proxy \
  --network iron-proxy --ip 172.20.0.2 \
  -v $(pwd)/proxy.yaml:/etc/iron-proxy/proxy.yaml:ro \
  -v $(pwd)/certs/ca.crt:/etc/iron-proxy/ca.crt:ro \
  -v $(pwd)/certs/ca.key:/etc/iron-proxy/ca.key:ro \
  --env-file .env \
  ironsh/iron-proxy:latest -config /etc/iron-proxy/proxy.yaml

4. 컨테이너를 프록시로 라우팅

가장 간단한 방법은 DNS 기반 라우팅입니다. 컨테이너의 DNS를 iron-proxy로 지정하면 모든 호스트 이름 조회가 프록시 IP로 확인되어 트래픽이 자동으로 프록시를 통해 라우팅됩니다:```bash docker run --rm
--network iron-proxy
--dns 172.20.0.2
-v $(pwd)/certs/ca.crt:/certs/ca.crt:ro
curlimages/curl --cacert /certs/ca.crt https://httpbin.org/get

root@kitploit:~
더 강력한 강제 적용을 위해, 비프록시 이그레스를 차단하는 nftables 규칙을 계층화하거나,
커널 수준 인터셉션에는 TPROXY를 사용하세요. 각 접근 방식에 대한 자세한 내용은 [프록시로 트래픽
라우팅](#routing-traffic-to-the-proxy)을 참조하세요.

## 왜 iron-proxy인가?

|                          | iron-proxy                     | Squid                       | mitmproxy                 | Envoy                              |
| ------------------------ | ------------------------------ | --------------------------- | ------------------------- | ---------------------------------- |
| 기본 거부 이그레스      | 내장                           | 복잡한 ACL 구성 필요         | 사용자 지정 스크립팅 필요   | RBAC/필터 구성 필요                  |
| 시크릿 주입              | 내장                           | 없음                         | 없음                      | 없음                               |
| 구조화된 감사 로깅      | 내장, 변환별 추적              | 기본 액세스 로그            | 플러그인 기반              | 구성 가능한 액세스 로그            |
| 설정 복잡성              | 단일 바이너리 + YAML           | 방대한 구성 언어            | Python 스크립팅           | 복잡한 YAML 또는 컨트롤 플레인      |

iron-proxy는 단 한 가지 작업을 위해 설계되었습니다: 신뢰할 수 없는 워크로드에서 이그레스를 제어하고 감사하는
것입니다. Squid는 기본 거부를 수행할 수 있지만 상당한 ACL 구성이 필요하며 비밀 값 주입
개념이 없습니다. mitmproxy는 훌륭한 디버깅 도구이지만 프로덕션 강제 적용을 위해 설계되지는 않았습니다.
Envoy는 범용 프록시로, 이 기능의 일부를 수행하도록 구성할 수 있습니다.
하지만 이는 문제가 요구하는 것보다
훨씬 더 복잡합니다.

## 작동 방식

iron-proxy는 DNS 서버와 HTTP/HTTPS 프록시를 실행합니다. 컨테이너의 DNS를
iron-proxy로 지정하면 모든 호스트 이름 조회가 프록시 IP로 확인되어 트래픽이
자동으로 프록시를 통해 라우팅됩니다. 프록시는 TLS를 종료하고(제공한 CA에서
리프 인증서를 즉석에서 생성), 요청을 순서가 있는 변환 파이프라인을 거쳐
업스트림으로 전달한 다음, 응답을 다시 파이프라인을 통과시킵니다.```
Container → DNS lookup → iron-proxy IP → TLS termination → transforms → upstream

변환은 순서대로 실행됩니다. 내장 변환:

변환기능
allowlist일치하는 도메인/CIDR에 대한 요청을 허용하며, 그 외의 모든 요청은 거부합니다(403).
secrets프록시 토큰을 찾기 위해 헤더(선택적으로 쿼리, 경로 또는 본문)를 스캔하고 환경 변수의 실제 시크릿으로 교체합니다.
body_capture일치하는 호스트의 디코딩된 요청 본문을 request_body 감사 필드로 기록합니다. 관찰 전용이며 절대 거부하지 않습니다.

구성

iron-proxy는 단일 플래그인 -config path/to/config.yaml을 사용합니다. 전체 구조는 다음과 같습니다(복사하여 붙여넣기 가능한 시작점은 iron-proxy.example.yaml을 참조하세요):```yaml dns: listen: ":53" proxy_ip: "10.16.0.1" # IP where iron-proxy is running (required) passthrough: # Domains forwarded to OS resolver - "*.internal.corp" - "metadata.google.internal" records: # Static DNS records (highest precedence) - name: "internal.example.com" type: A value: "10.0.0.5"

proxy: http_listen: ":80" https_listen: ":443" tunnel_listen: ":8080" # Optional CONNECT/SOCKS5 listener max_request_body_bytes: 1048576 # 1 MiB (default) max_response_body_bytes: 0 # uncapped (default)

tls: ca_cert: "/etc/iron-proxy/ca.crt" # Required ca_key: "/etc/iron-proxy/ca.key" # Required cert_cache_size: 1000 # LRU cache for generated leaf certs leaf_cert_expiry_hours: 72

transforms:

  • name: allowlist config: domains: - "api.openai.com" - "*.anthropic.com" cidrs: - "10.0.0.0/8"

  • name: secrets config: secrets: - source: type: env var: OPENAI_API_KEY # Env var holding the real secret proxy_value: "proxy-token-123" # Token the sandbox sends match_headers: ["Authorization"] match_body: false require: true # Reject requests without the proxy token rules: - host: "api.openai.com"

log: level: "info" # debug, info, warn, error

root@kitploit:~
### DNS

기본적으로 모든 것은 `proxy_ip`로 해석되며, 이를 통해 트래픽이
프록시를 거쳐 라우팅됩니다. 예외:

- **`passthrough`:** OS 리졸버로 전달되는 glob 패턴 (예:
  `*.internal.corp`). 이러한 호스트로 향하는 트래픽은 프록시를 완전히 우회합니다.
- **`records`:** 정적 A 또는 CNAME 레코드. 가장 높은 우선순위를 가집니다.

### 응답 재시도 핸들러

외부 승인된 응답 재시도를 활성화하려면 `IRON_RESPONSE_RETRY_HANDLER_URL`,
`IRON_RESPONSE_RETRY_COMPLETE_URL`, `IRON_RESPONSE_RETRY_HANDLER_TOKEN`,
`IRON_RESPONSE_RETRY_HANDLER_SANDBOX_ID` 및 쉼표로 구분된
`IRON_RESPONSE_RETRY_STATUSES` 목록을 설정하세요. 권한 부여 핸들러는 정확한 업스트림 스킴, authority, 메서드,
경로/쿼리, 재생 가능성, 응답 상태 및 헤더, 트레이스 컨텍스트 및
샌드박스 ID를 수신합니다. 정확히 한 번의 재생을 위해 요청 헤더와 시도 ID를
반환할 수 있습니다. 그런 다음 완료 핸들러는 `IRON_RESPONSE_RETRY_COMPLETION_HEADERS`에 의해
선택된 재생 상태 및 응답 헤더를 수신하며, 기본값은 `Payment-Receipt`입니다.

응답 본문은 어떤 핸들러에도 전송되지 않으며, 대상(destination)은 변경할 수 없고,
연결/프레이밍 헤더는 거부됩니다. `proxy.max_request_body_bytes`를 초과하는 요청은
정상적으로 진행되지만 재생 불가능으로 표시됩니다. 챌린지가 발생하면 원래 응답이 반환됩니다.
핸들러 오류가 발생해도 원래 응답이 유지됩니다. 핸들러 URL은 루프백이거나
신뢰할 수 있는 내부 네트워크에 대해 `IRON_RESPONSE_RETRY_HANDLER_ALLOW_HTTP=true`가 명시적으로 구성된 경우가 아니면 HTTPS를 사용해야 합니다.
리다이렉트는 거부되며, 응답 재시도 토큰은 컨트롤 플레인 토큰과 독립적으로 구성되어야 합니다. WebSocket,
gRPC 및 길이를 알 수 없는 스트리밍 요청은 응답 재시도 처리를 우회합니다.

신뢰할 수 있는 핸들러가 `proxy.upstream_deny_cidrs` 내부에서 해석되는 경우,
`IRON_RESPONSE_RETRY_HANDLER_ALLOW_CIDRS`를 사용할 수 있는 좁은 사설 CIDR의 쉼표로 구분된 목록으로 설정하세요.
이 예외는 정확히 구성된 authorize 및 complete 엔드포인트에만 적용되며, 일반 프록시 트래픽은
전체 업스트림 거부 목록의 적용을 받습니다. 공용, 루프백, 링크-로컬 및 클라우드
메타데이터 범위는 이 설정을 통해 추가할 수 없습니다.

### 허용 목록

기본적으로 거부(Default-deny)입니다. 요청이 진행되려면 최소한 하나의 도메인 glob 또는 CIDR와 일치해야 합니다.
일치하지 않는 요청은 `403 Forbidden`을 받습니다.

도메인 패턴은 glob 매칭을 사용합니다: `*.example.com`은 모든 하위 도메인과
`example.com` 자체도 일치시킵니다.

**경고 모드:** `warn: true`를 설정하면 허용 목록이 실제로 적용하지 않고
차단할 항목을 확인할 수 있습니다. 거부될 요청은 통과되지만
변환 추적에서 `"action": "warn"`으로 주석 처리됩니다.
이는 새 허용 목록 규칙을 점진적으로 도입하거나 적용 전에 기존 트래픽을
감사할 때 유용합니다.

### 주석

host/method/path 규칙에 따라 HTTP 요청 헤더를 감사 로그 주석으로 캡처합니다.
이는 프록시 코어를 수정하지 않고 요청 ID와 같은 요청별 컨텍스트로 감사 로그를
보강할 때 유용합니다.

각 주석 그룹은 일치시킬 규칙과 캡처할 헤더를 지정합니다. 요청이
그룹의 규칙 중 하나와 일치하면 지정된 헤더 값은 변환 추적 주석에서
`header:<Name>` 항목으로 기록됩니다. 일치하지 않는 요청은 변경 없이 통과됩니다.
이 변환은 요청을 거부하지 않습니다.

> **경고:** 헤더 값은 감사 로그에 일반 텍스트로 출력됩니다. 요청 ID 또는
> 프록시 비밀 토큰을 포함하는 헤더처럼 노출해도 안전한 헤더만 로그로 기록하세요.
> 원본 비밀을 포함하는 헤더는 로그로 기록하지 마세요.```yaml
transforms:
  - name: annotate
    config:
      annotations:
        - rules:
            - host: "api.openai.com"
              methods: ["POST"]
              paths: ["/v1/*"]
          headers: ["x-request-id"]
        - rules:
            - host: "*.anthropic.com"
          headers: ["x-request-id"]

헤더 허용 목록

기본 거부(default-deny) 요청 헤더 필터입니다. 구성된 headers 목록에 없는 정식 이름(canonical name)의 요청 헤더는 요청이 업스트림으로 전달되기 전에 제거됩니다. 샌드박스가 첨부할 수 있는 추적, 핑거프린팅 또는 우발적 누출 헤더(쿠키, 내부 상관관계 ID, X-Forwarded-* 등)를 차단하는 데 유용합니다.

항목은 정식 헤더 이름에 대해 대소문자를 구분하지 않고 매칭됩니다. /.../로 구분된 패턴(예: /^X-Trace-.*$/)은 secrets 변환의 match_headers 구문을 미러링하는 대소문자 구분 없는 정규 표현식입니다.

선택적 rules는 허용 목록을 특정 호스트/메서드/경로로 제한합니다. 생략하면 허용 목록은 이 변환에 도달하는 모든 요청에 적용됩니다.

하나 이상의 헤더가 제거되면 추적(trace)에 제거된 이름을 나열하는 stripped_headers 주석이 추가됩니다.

배치: header_allowlist를 secrets 뒤에 배치하세요 (허용 목록에 없는 경우 삽입된 자격 증명이 제거되지 않도록 목록에 추가할 수 있습니다) 그리고 annotate 뒤에 배치하세요 (주석이 원래 헤더를 읽도록).```yaml transforms:

  • name: header_allowlist config: headers: - "Authorization" - "Content-Type" - "User-Agent" - "Accept" - "/^X-Trace-.*$/" rules: - host: "api.openai.com"
root@kitploit:~
### 본문 캡처

일치하는 요청의 디코딩된 요청 본문을 기록하고, 이를 감사 로그 레코드의 `body_capture` 그룹에 `request_body` 및 `request_body_truncated`로 표시합니다. 프록시를 통과하는 페이로드(예: 샌드박스가 LLM 제공자에게 보내는 프롬프트)를 수정하지 않고 감사하는 데 유용합니다.

호스트, 메서드, 경로는 `allowlist` 및 `secrets`와 동일한 `rules` 구문으로 매칭됩니다. `max_request_body_bytes`는 각 본문에서 캡처되는 양을 제한합니다. 한도를 초과하는 본문은 앞부분으로 잘리며 `request_body_truncated`가 `true`로 설정됩니다. 기본 한도는 16 KiB이며 전역 `proxy.max_request_body_bytes` 제한과 독립적입니다. 이 변환은 관찰 전용입니다. 요청을 거부하지 않으며, 본문 읽기 오류는 요청을 실패시키는 대신 트레이스에 주석으로 기록됩니다.

캡처가 성공하면 `request_transforms`의 변환 항목에 `captured_bytes`와 `truncated`가 주석으로 기록되어, 본문 자체를 중복하지 않으면서 트레이스에 본문이 캡처되었음을 기록합니다.

응답 본문은 캡처되지 않습니다. 스트리밍 응답(SSE)은 전달 전에 종단 간 버퍼링해야 하므로 클라이언트가 지연될 수 있습니다.

> **경고:** 캡처된 본문은 감사 로그에 일반 텍스트로 기록됩니다. `secrets`가 `match_body: true`로 실행될 때, `body_capture`를 `secrets` *앞에* 배치하여 감사 로그가 `secrets`가 본문에 교체하는 실제 자격 증명 대신 샌드박스의 프록시 토큰을 기록하도록 하십시오.```yaml
transforms:
  - name: body_capture
    config:
      max_request_body_bytes: 16384
      rules:
        - host: "api.anthropic.com"
          methods: ["POST"]
          paths: ["/v1/messages"]
        - host: "api.openai.com"
          methods: ["POST"]
          paths: ["/v1/chat/completions"]

Secrets

샌드박스는 실제 자격 증명을 절대 보관하지 않습니다. 대신:

  1. 실제 비밀 소스로 iron-proxy를 구성합니다: 환경 변수, 디스크의 파일, AWS Secrets Manager, AWS Systems Manager Parameter Store, 1Password(서비스 계정), 또는 1Password Connect.
  2. 샌드박스에 프록시 토큰을 부여합니다(예: proxy-openai-abc123).
  3. secrets 변환을 구성하여 프록시 토큰을 해당 소스에 매핑합니다.

iron-proxy는 나가는 요청을 스캔하여 업스트림으로 전달하기 전에 프록시 토큰을 실제 값으로 교체합니다. 검색 위치를 직접 제어할 수 있습니다:

  • match_headers: 스캔할 헤더 이름 목록. 빈 목록 = 모든 헤더. 리터럴 이름은 대소문자를 구분하지 않고 일치하지만, 작성한 대소문자 형식은 헤더가 업스트림으로 전달될 때 유지됩니다. /.../로 구분된 항목은 정규화된 헤더 이름에 대해 일치하는 대소문자 구분 없는 정규 표현식으로 컴파일됩니다(예: /^x-.*-key$/).
  • match_body: 요청 본문을 스캔합니다(max_request_body_bytes까지 버퍼링됨).
  • match_query: URL 쿼리 문자열을 스캔합니다. 기본값은 false입니다. 쿼리 매개변수에 비밀을 기대하는 업스트림을 위해 선택적으로 활성화합니다. 쿼리 문자열은 프록시 양쪽의 액세스 로그에 자주 나타나므로 기본적으로 꺼져 있습니다.
  • match_path: URL 경로를 스캔합니다. 기본값은 false입니다. 경로에 비밀을 포함하는 Telegram과 같은 업스트림(예: /bot<TOKEN>/sendMessage)을 위해 선택적으로 활성화합니다. URL 경로는 프록시 양쪽의 액세스 로그에 자주 나타나므로 기본적으로 꺼져 있습니다.
  • require: true인 경우, 일치하는 호스트에 대한 요청 중 프록시 토큰을 않는 요청은 403으로 거부됩니다. 이는 손상된 워크로드가 대체 자격 증명으로 비밀 교체 메커니즘을 우회하는 것을 방지합니다. 기본값: .

쿼리 매개변수는 항상 스캔됩니다.

비밀 소스:

  • env: 프록시 프로세스 환경 변수에서 var를 읽습니다. 프로세스 시작 시 고정됩니다. 실행 중인 프록시의 값을 교체해야 하는 경우 대신 file을 사용하십시오.
  • file: 디스크의 path에서 비밀을 읽습니다. 파일은 구성이 리로드될 때마다(부팅 및 각각의 POST /v1/reload) 그리고 ttl이 설정된 경우 캐시 만료 시 다시 읽힙니다. 따라서 파일을 다시 쓰고(원자적으로: 임시 파일 쓰기 + 이름 변경) 리로드하는 것만으로 재시작 없이 실행 중인 프록시의 비밀을 교체할 수 있습니다. 값은 파일 내용 그대로입니다(트리밍 없음). 따라서 작성자가 후행 공백을 제어합니다. 선택적 ttl 및 failure_ttl이 지원됩니다.
  • aws_sm: AWS Secrets Manager에서 secret_id를 읽습니다. 선택적 region, ttl, failure_ttl이 지원됩니다.

모든 소스는 선택적 json_key도 허용합니다. 설정된 경우 해석된 값은 JSON 객체로 파싱되고 해당 키의 단일 최상위 문자열 필드가 추출됩니다. JSON 비밀에서 하나의 필드를 꺼내는 데 사용합니다.

ttl은 성공적으로 가져온 값이 새로고침 전에 캐시되는 시간을 제어합니다(비어 있으면 영구 캐시). failure_ttl은 가져오기 오류가 재시도 전에 캐시되는 시간을 제어합니다. 기본값은 1m이며 ttl과 독립적이므로, 긴 성공 TTL이 일시적인 백엔드 장애로부터의 복구를 지연시키지 않습니다.

참고: onepassword-sdk-go의 버그로 인해 CGO_ENABLED=0 빌드가 실패하므로, iron-proxy는 업스트림에서 수정 사항이 반영될 때까지 go.mod의 replace 지시문을 통해 포크를 고정합니다.

Judge

judge 변환은 URL 규칙과 일치하는 요청에 대한 허용/거부 결정을 생성하기 위해 LLM을 호출합니다. transforms: 아래의 각 항목은 고유한 자연어 정책, LLM 백엔드, 제한 시간, 세마포어 및 회로 차단기를 가진 독립적인 judge 인스턴스입니다. 운영자는 서로 다른 규칙에 범위가 지정된 서로 다른 프롬프트를 사용하여 judge를 0개, 1개 또는 여러 개 배포할 수 있습니다.```yaml

  • name: judge config: name: "github-write-guard" # required; identifies the instance in audit logs fallback: "deny" # deny (default) | skip. No "allow" fallback ships in v1. timeout: "8s" # per-call LLM timeout max_concurrent: 100 # semaphore capacity; additional calls wait circuit_breaker: consecutive_failures: 5 cooldown: "10s" rules: # uses the same matcher as allowlist/secrets - host: "api.github.com" methods: ["POST", "PATCH", "DELETE", "PUT"] provider: type: "anthropic" # "anthropic" or "openai" model: "claude-haiku-4-5-20251001" api_key_env: "ANTHROPIC_API_KEY" max_tokens: 256 prompt: | Natural-language policy describing what is allowed for requests that match the rules above. Kept short and specific.
root@kitploit:~
불변 조건:

- judge는 거부만 할 수 있다. 정적 허용 목록이 거부했을 요청을 승인하는
  일은 결코 없다. 정적 거부가 항상 우선한다.
- 일치하지 않는 요청은 무시된다: LLM 호출도, 감사 주석도 없다.
- LLM 오류, 시간 초과, 회로 차단기 개방 또는 잘못된 형식의 모델 출력이 발생하면,
  구성된 `fallback`이 적용된다. `deny`는 요청을 차단한다(프로덕션에서 권장되는
  기본값). `skip`은 파이프라인의 나머지 단계로 처리를 넘긴다. iron-proxy는
  기본 거부(default-deny) 방식이므로 일치하지 않는 요청도 여전히 차단된다.

시크릿 변환(secrets transform)과의 파이프라인 순서:

- **권장:** judge를 secrets transform **앞에** 배치한다. LLM
  공급자는 워크로드가 접근할 수 있는 실제 자격 증명이 아닌 프록시 토큰만
  보게 된다.
- 또는 judge를 secrets transform 뒤에 배치하면 실제로 나가는 정확한 와이어
  형식을 평가할 수 있지만, 실제 자격 증명을 LLM 공급자에게 보내는
  대가를 치른다. 위협 모델이 그 트레이드오프를 수용할 때만 이 방식을 선택하라.

지원되는 공급자:

- **`anthropic`** (Messages API). `api_key_env`, `model`, 선택적
  `base_url` 및 `max_tokens`를 사용한다.
- **`openai`** (Chat Completions API). 위와 동일한 필드를 사용한다.
  `type: openai`로 설정하고, `api_key_env`를 OpenAI 키를 보관하는 환경
  변수를 가리키게 한 다음 `gpt-5.4-nano` 같은 모델을 선택한다.

감사 출력: 일치하는 모든 요청은 변환 추적(transform trace) 아래에 구조화된 필드를
추가한다. 여기에는 `judge.instance`, `judge.decision`, `judge.reason`,
`judge.duration_ms`, `judge.input_tokens`, `judge.output_tokens`,
`judge.fallback_applied`(fallback이 실행될 때) 및
`judge.circuit_breaker_tripped`(회로 차단기가 열려 있을 때)가 포함된다.

크레딧: 이 설계에 영감을 준 Brex의 CrabTrap 프로젝트(MIT 라이선스)에
감사드린다.

## MCP 정책

iron-proxy는 [MCP의 Streamable HTTP 전송](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports)을 지원한다. 요청이 구성된 MCP 서버와 일치하면 프록시는 JSON-RPC 본문을 파싱하고, 기본 거부(default-deny) 도구 허용 목록을 적용하며, `tools/list` 응답을 필터링하여 거부된 도구가 에이전트에 도달하지 못하게 한다. SSE 응답은 이벤트별로 필터링되므로 수명이 긴 MCP 스트림도 계속 유지된다.

이는 변환(transform)이 아닌 일급 프록시 기능이다. MCP 응답은 서버가 시작한 임의의 메시지를 담은 개방형 SSE 스트림일 수 있으므로 요청/응답 변환 계약에 맞지 않기 때문이다.```yaml
mcp:
  # JSON-RPC error envelope returned to the agent on policy denial.
  # Defaults: code -32001, message "blocked by iron-proxy policy".
  error:
    code: -32001
    message: "blocked by iron-proxy policy"
  servers:
    - name: github                         # appears in audit as mcp.server
      rules:                               # standard host/method/path rules
        - host: "mcp.github.com"
          paths: ["/mcp", "/mcp/*"]
      tools:
        - name: "search_repositories"      # always allowed
        - name: "create_issue"
          when:                            # all clauses must hold; otherwise deny
            - path: "owner"                # dotted path against arguments
              equals: "ironsh"
            - path: "repo"
              in: ["iron-proxy", "tunis-v2"]
        # Anything not listed is denied (default-deny).

Behavior:

  • tools/call 시행. 서버의 tools 목록에 없는 도구에 대한 호출 또는 해당 arguments가 when 절을 충족하지 못하는 호출은 업스트림에 도달하지 않고 거부됩니다. 프록시는 구성된 코드와 메시지 및 요청의 원래 id를 사용하여 JSON-RPC 오류 응답을 반환하므로 MCP 클라이언트는 HTTP 오류가 아닌 일반적인 프로토콜 오류를 보게 됩니다.
  • tools/list 필터링. tools/list에 대한 응답은 에이전트에 도달하기 전에 허용 목록에 없는 도구가 제거됩니다. application/json 및 text/event-stream 응답 모두에서 작동하며, SSE 필터링은 이벤트별로 수행되므로 하트비트 및 스트림의 다른 메시지는 그대로 통과합니다.
  • 인수 매칭. 각 when 절에는 점으로 구분된 path(예: arguments.repo, labels.0)와 equals(모든 JSON 스칼라), (스칼라 목록) 또는 (문자열 값에 대한 정규식) 중 하나가 포함됩니다. 절은 AND로 결합됩니다. 을 생략하면 도구가 무조건 허용됩니다.

파이프라인 순서: MCP 인터셉터는 변환 파이프라인 이후에 실행되므로, 인터셉터가 본문을 평가할 때 allowlist가 여전히 연결 가능한 호스트를 제한하고 secrets가 이미 프록시 토큰을 교체한 상태입니다.

MCP 게이트웨이

mcp_gateway는 MCP 정책이 요청을 수락한 후 클라이언트를 대상으로 하는 MCP 호스트를 실제 업스트림 서버로 라우팅합니다. 이를 통해 에이전트는 안정적인 내부 호스트를 호출하는 동안 iron-proxy가 실제 업스트림으로 전달하고 샌드박스에 절대 유입되지 않는 자격 증명을 주입할 수 있습니다.

게이트웨이 경로는 MCP 서버와 일치한 요청에만 적용됩니다. MCP 정책은 여전히 도구 허용 목록을 먼저 적용합니다. 정책이 tools/call을 거부하면 게이트웨이 경로가 적용되지 않고 업스트림에 도달하지 않습니다.```yaml mcp: servers: - name: github rules: - host: "github.mcp.local" paths: ["/mcp", "/mcp/*"] tools: - name: "search_repositories"

mcp_gateway: routes: - name: github rules: - host: "github.mcp.local" paths: ["/mcp", "/mcp/*"] upstream: "https://mcp.github.com/v1" credentials: - source: type: env var: GITHUB_MCP_TOKEN inject: header: Authorization formatter: "Bearer {{ .Value }}"

root@kitploit:~
자격 증명은 `secrets` 변환과 동일한 비밀 소스를 사용합니다. 기본적으로 필수입니다. 자격 증명에 `require: false`를 설정하면 사용할 수 없을 때 건너뜁니다. 감사 로그에는 경로, 업스트림 URL, 자격 증명 주입 위치가 기록되지만, 주입된 자격 증명 값은 기록되지 않습니다.

v1의 제한 사항:

- Streamable HTTP 전송만 지원됩니다. 레거시 HTTP+SSE 전송(별도의 `/messages` 및 `/sse` 엔드포인트)은 지원되지 않습니다.
- 거부된 항목이 포함된 JSON-RPC 배치는 전체 배치가 거부됩니다. 부분 배치 전달은 지원되지 않습니다.
- 리소스와 프롬프트는 강제되지 않습니다. 에이전트는 정책 필터링 없이도 `resources/list`, `resources/read` 등을 계속 호출할 수 있습니다.

### 본문 크기 제한

요청/응답 본문을 검사하거나 전달하는 변환(secrets 본문 매칭, gRPC 변환)은 버퍼링된 본문에서 작동합니다. 두 가지 전역 설정이 최대 버퍼 크기를 제어합니다:

- **`max_request_body_bytes`** (기본값: `1048576` / 1 MiB): 변환을 위해 버퍼링되는 요청 본문의 최대량을 제한합니다. 이 한도를 초과하는 데이터는 변환 관점에서 잘리지만 여전히 업스트림으로 전달됩니다.
- **`max_response_body_bytes`** (기본값: `0` / 무제한): 버퍼링되는 응답 본문의 최대량을 제한합니다. `0`으로 설정하면 전체 응답을 버퍼링하며, 이는 대부분의 워크로드(예: npm 패키지, 모델 가중치)에서 올바른 기본값입니다.

본문은 변환이 읽을 때 증분 방식으로 버퍼링되며 파이프라인 단계 사이에서 자동으로 되감깁니다. 변환이 본문을 읽지 않으면 버퍼링이 발생하지 않으며 본문은 변경 없이 스트리밍됩니다.

### 터널 리스너 (HTTP/CONNECT/SOCKS5)

터널 리스너는 전용 포트에서 absolute-form HTTP 프록시 요청, HTTP CONNECT 및 SOCKS5 연결을 수락합니다. 이는 DNS 기반 라우팅에 의존하는 대신 `HTTP_PROXY`/`HTTPS_PROXY`/`ALL_PROXY` 환경 변수 또는 SOCKS5 설정을 통해 프록시 구성을 기본적으로 지원하는 도구에 유용합니다.

이를 활성화하려면 `proxy` 아래에 `tunnel_listen`을 설정하세요:```yaml
proxy:
  tunnel_listen: ":8080"

생략하면 터널 리스너가 비활성화됩니다.

모든 프로토콜은 일반 HTTP/HTTPS 요청과 동일한 변환 파이프라인을 거칩니다. Absolute-form HTTP 요청은 일반 HTTP 프록시 경로로 처리됩니다. CONNECT 및 SOCKS5의 경우 프록시는 합성 CONNECT 요청을 허용 목록 및 시크릿 변환에 대해 평가하므로, 터널 연결은 동일한 기본 거부(default-deny) 정책을 따릅니다.

CONNECT 또는 SOCKS5 핸드셰이크 후 프록시는 첫 번째 바이트를 확인하여 내부 프로토콜을 감지합니다:

  • TLS (0x16): HTTPS 리스너와 동일한 방식으로 MITM을 수행하며, 즉시 리프 인증서(leaf cert)를 생성하여 변환이 요청을 검사하고 재작성할 수 있게 합니다.
  • Plain HTTP: 요청을 변환 파이프라인을 통해 직접 처리합니다.

HTTP CONNECT 예시:```bash curl -x http://172.20.0.2:8080
--cacert /certs/ca.crt
https://httpbin.org/get

root@kitploit:~
**일반 HTTP 프록시 예제:**```bash
curl -x http://172.20.0.2:8080 \
  http://httpbin.org/get

SOCKS5 예제:```bash curl --socks5-hostname 172.20.0.2:8080
--cacert /certs/ca.crt
https://httpbin.org/get

root@kitploit:~
표준 환경 변수를 설정하여 모든 도구가 터널을 통해 자동으로 라우팅되도록 할 수도 있습니다:```bash
export HTTP_PROXY=http://172.20.0.2:8080
export HTTPS_PROXY=http://172.20.0.2:8080
export ALL_PROXY=socks5h://172.20.0.2:8080

SOCKS5 구현은 no-auth만 지원하며 IPv4, IPv6, 및 도메인 이름 주소 유형을 허용합니다.

TLS

iron-proxy는 제공한 CA가 서명한 리프 인증서를 즉시 생성합니다. 클라이언트 컨테이너는 이 CA를 신뢰해야 합니다(시스템 신뢰 저장소에 추가하거나 --cacert로 전달). 인증서는 SNI 호스트 이름을 키로 하는 LRU 캐시에 저장됩니다.

프록시로 트래픽 라우팅

세 가지 접근 방식이 있으며, 적용 수준이 점점 강화됩니다.

DNS 기반(간단)

컨테이너의 DNS를 iron-proxy로 지정합니다. 모든 조회가 프록시 IP로 확인되므로 HTTP/HTTPS 트래픽이 자연스럽게 이를 통해 흐릅니다. 이것이 Docker Compose 예제에서 사용하는 방식입니다:```yaml services: client: dns: - 172.20.0.2 # iron-proxy IP

root@kitploit:~
설정은 쉽지만 우회도 쉽다: 워크로드가 IP를 하드코딩하거나 자체
DNS 리졸버를 사용하여 프록시를 완전히 건너뛸 수 있다.

### DNS + nftables 이그레스 방화벽 (강제 적용)

DNS 라우팅 위에 nftables 방화벽을 계층화한다. DNS는 여전히 트래픽을
프록시로 유도하지만, nftables는 워크로드가 _어떤 다른 것과도_ 통신할 수 없게 하며,
하드코딩된 IP가 있어도 마찬가지다.

[`examples/nftables`](https://github.com/paradigmxyz/iron-proxy/blob/HEAD/examples/nftables/) 디렉토리에는 작동하는 설정이 포함되어 있다.
클라이언트 컨테이너는 시작 시 방화벽 규칙을 로드하여
애플리케이션 트래픽을 실행하기 전에 적용한다:

**nftables.conf**는 프록시로 가는 트래픽을 허용하고 그 외 모든 것을 차단한다:```
table ip iron {
  chain output {
    type filter hook output priority 0; policy drop;

    # allow loopback
    oif lo accept

    # allow traffic to the proxy itself (DNS + HTTP/HTTPS)
    ip daddr 172.20.0.2 tcp dport { 80, 443 } accept
    ip daddr 172.20.0.2 udp dport 53 accept

    # allow established/related (return traffic)
    ct state established,related accept

    # log and drop everything else
    log prefix "iron-proxy-drop: " drop
  }
}

docker-compose.yml: 클라이언트 이미지는 nftables가 사전 설치된 상태로 빌드됩니다. entrypoint가 규칙을 로드한 다음 데모를 실행합니다. CAP_NET_ADMIN은 규칙을 로드하는 데 필요합니다:```yaml services: proxy: # ... same as DNS example ... networks: demo: ipv4_address: 172.20.0.2

client: build: context: . dockerfile: Dockerfile.client # alpine + curl + nftables dns: - 172.20.0.2 cap_add: - NET_ADMIN volumes: - ./nftables.conf:/etc/nftables.conf:ro - certs:/certs:ro networks: demo: ipv4_address: 172.20.0.4

root@kitploit:~
프로덕션 환경에서는 엔트리포인트 래퍼에서 규칙을 로드한 다음
`exec`로 실제 프로세스를 `CAP_NET_ADMIN` 없이 루트가 아닌 사용자로 실행할 것입니다.

### TPROXY (투명 프록시)

워크로드의 DNS를 전혀 제어할 수 없는 환경에서는 nftables
TPROXY가 커널 수준에서 워크로드의 협력 없이도 트래픽을
리다이렉트할 수 있습니다. 이는 PREROUTING 체인의 패킷을 가로채서
iron-proxy로 직접 전달합니다:```
table ip iron {
  chain prerouting {
    type filter hook prerouting priority mangle; policy accept;

    # redirect HTTP/HTTPS to iron-proxy via TPROXY
    tcp dport 80 tproxy to 172.20.0.2:80 meta mark set 1 accept
    tcp dport 443 tproxy to 172.20.0.2:443 meta mark set 1 accept
  }

  chain output {
    type route hook output priority mangle; policy accept;

    # mark locally-originated packets for policy routing
    tcp dport { 80, 443 } meta mark set 1
  }
}

이를 위해서는 마킹된 패킷을 로컬 소켓으로 라우팅하도록 ip rule 및 ip route 설정이 필요하며, iron-proxy는 IP_TRANSPARENT로 바인딩되어야 합니다. 설정이 더 복잡하지만 트래픽이 프록시를 우회할 수 없다는 가장 강력한 보장을 제공합니다. TPROXY는 DNS 아래에서 작동하므로 하드코딩된 IP, 사용자 정의 리졸버 및 워크로드가 시도할 수 있는 다른 모든 것을 잡아냅니다.

Docker Compose 예제

examples/docker-compose 디렉토리에는 작동하는 설정이 포함되어 있습니다. 핵심 구성 요소:

docker-compose.yml: 프록시와 클라이언트는 공유 브리지 네트워크에 있습니다. 실제 비밀은 프록시 컨테이너에서만 환경 변수로 설정됩니다:```yaml services: proxy: build: context: ../.. dockerfile: examples/docker-compose/Dockerfile environment: - OPENAI_API_KEY=sk-real-openai-key-do-not-share - INTERNAL_TOKEN=real-internal-secret-value volumes: - certs:/certs networks: demo: ipv4_address: 172.20.0.2

client: image: alpine:latest dns: - 172.20.0.2 # Point DNS at the proxy volumes: - certs:/certs:ro networks: demo: ipv4_address: 172.20.0.4

root@kitploit:~
**proxy.yaml**은 `httpbin.org` 및 `icanhazip.com`을 허용 목록에 추가하고, 두 개의 시크릿을 교체합니다:```yaml
transforms:
  - name: allowlist
    config:
      domains:
        - "httpbin.org"
        - "icanhazip.com"
      cidrs:
        - "172.20.0.0/24"

  - name: secrets
    config:
      secrets:
        - source:
            type: env
            var: OPENAI_API_KEY
          replace:
            proxy_value: "proxy-openai-abc123"
            match_headers: ["Authorization"]
            match_query: true # scan the query string
          rules:
            - host: "httpbin.org"

        - source:
            type: env
            var: INTERNAL_TOKEN
          proxy_value: "proxy-internal-tok"
          match_headers: [] # scan all headers
          rules:
            - host: "httpbin.org"

클라이언트 스크립트는 각 동작을 시연하기 위해 다섯 개의 요청을 전송합니다:```bash

1. Allowed request

curl https://httpbin.org/get

2. Blocked request (not in allowlist)

curl https://example.com/

3. Secret swap: proxy token replaced with real key in Authorization header

curl -H "Authorization: Bearer proxy-openai-abc123" https://httpbin.org/headers

4. Secret swap: proxy token in custom header

curl -H "X-Internal: proxy-internal-tok" https://httpbin.org/headers

5. Secret swap: proxy token in query parameter

curl "https://httpbin.org/get?token=proxy-openai-abc123&q=hello"

root@kitploit:~
## 감사 로그 형식

모든 프록시 요청은 구조화된 JSON 로그 항목을 생성합니다:```json
{
  "host": "httpbin.org",
  "method": "GET",
  "path": "/headers",
  "action": "allow",
  "status_code": 200,
  "duration_ms": 142,
  "request_transforms": [
    {
      "name": "allowlist",
      "action": "continue"
    },
    {
      "name": "secrets",
      "action": "continue",
      "annotations": {
        "swapped": [{ "secret": "OPENAI_API_KEY", "locations": ["header:Authorization"] }]
      }
    }
  ],
  "response_transforms": []
}

거부된 요청에는 rejected_by 필드가 포함되며 WARN 레벨로 기록됩니다.

OpenTelemetry 내보내기

감사 이벤트는 Axiom, ClickHouse, Logfire 같은 백엔드에서 오프라인 분석을 위해 OpenTelemetry 구조화 로그 레코드로 내보낼 수 있습니다. 활성화하려면 OTEL_EXPORTER_OTLP_ENDPOINT를 설정하세요:```bash docker run -d --name iron-proxy
-e OTEL_EXPORTER_OTLP_ENDPOINT=https://logfire-us.pydantic.dev
-e OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
-e OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer "
-e OTEL_SERVICE_NAME=iron-proxy
-e OTEL_RESOURCE_ATTRIBUTES="deployment.environment=staging" \

... other flags ...

ironsh/iron-proxy:latest -config /etc/iron-proxy/proxy.yaml

root@kitploit:~
All configuration uses standard OTEL environment variables:

| Variable                       | Description                                             | Default          |
| ------------------------------ | ------------------------------------------------------- | ---------------- |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector URL. OTEL export is disabled when unset. | (비활성화)       |
| `OTEL_EXPORTER_OTLP_PROTOCOL` | `http/protobuf` 또는 `grpc`.                            | `http/protobuf`  |
| `OTEL_EXPORTER_OTLP_HEADERS`  | 인증 헤더용 쉼표로 구분된 `key=value` 쌍.               | (없음)           |
| `OTEL_SERVICE_NAME`            | 모든 로그 레코드에 첨부되는 서비스 이름.                | `iron-proxy`     |
| `OTEL_RESOURCE_ATTRIBUTES`    | 쉼표로 구분된 `key=value` 리소스 속성.                  | (없음)           |

활성화하면 모든 감사 이벤트는 기존 JSON stderr 로그와 함께 OTEL 로그 레코드로 내보내집니다. 로그 레코드는 JSON 감사 항목과 동일한 스키마를 가지며, `host`, `method`, `path`, `action`, `status_code`, `duration_ms`와 주석이 포함된 전체 `request_transforms`/`response_transforms` 배열을 포함합니다.

## 관리 API

iron-proxy는 운영 작업을 위해 선택적으로 인증된 HTTP API를 노출할 수 있습니다. 현재는 단일 엔드포인트인 `POST /v1/reload`를 제공하며, 이 엔드포인트는 디스크에서 YAML 구성을 다시 읽고 새로 빌드된 변환 파이프라인을 원자적으로 교체합니다. 새 구성이 유효하지 않으면 실행 중인 파이프라인이 유지됩니다.

관리 서버는 기본적으로 비활성화되어 있습니다. 활성화하려면 구성에 `management` 블록을 추가하세요:```yaml
management:
  # Bind on loopback unless you front this with a private network or auth proxy:
  # /v1/reload can rebuild the entire transform pipeline.
  listen: "127.0.0.1:9092"
  # Env var that holds the bearer token. Defaults to IRON_MANAGEMENT_API_KEY.
  api_key_env: "IRON_MANAGEMENT_API_KEY"

Standalone mode only — incompatible with control-plane managed mode.

Reload a running proxy:```bash curl -X POST http://127.0.0.1:9092/v1/reload
-H "Authorization: Bearer $IRON_MANAGEMENT_API_KEY"

root@kitploit:~
## iron.sh

Vault/KMS 비밀 백엔드, Kubernetes 연산자(operator), 또는 중앙 집중식 정책
관리가 필요하신가요? [iron.sh](https://iron.sh)는 iron-proxy를 기반으로 엔터프라이즈
기능을 대규모로 실행하는 팀을 위해 제공합니다.

## 릴리스 서명 확인

릴리스 아티팩트에는 서명된 체크섬 매니페스트가 포함됩니다:

- `checksums.txt`
- `checksums.txt.asc` (ASCII-armored detached signature)

포함된 공개 키 [`public-key.asc`](https://github.com/paradigmxyz/iron-proxy/blob/HEAD/public-key.asc)를 사용하여 확인하세요:```bash
# 1) Download release artifacts for a tag
TAG=vX.Y.Z
gh release download "$TAG" --pattern "checksums.txt" --pattern "checksums.txt.asc"

# 2) Import the project signing key
gpg --import public-key.asc

# 3) Verify the signature over checksums.txt
gpg --verify checksums.txt.asc checksums.txt

검증이 성공하면, GPG는 Matthew Slipper <[email protected]>의 유효한 서명을 보고합니다.

검증 전에 가져온 키 지문을 검사하여 신뢰하는 소스와 일치하는지 선택적으로 확인할 수 있습니다.

서명된 체크섬 목록에 대해 특정 바이너리를 검증하려면 (예: iron-proxy-linux-amd64):```bash shasum -a 256 iron-proxy-linux-amd64 | grep -F "$(grep -F 'iron-proxy-linux-amd64' checksums.txt | awk '{print $1}')"

root@kitploit:~
도구 다운로드
포함하지
false
  • hosts: 교체를 특정 도메인 또는 CIDR로 제한합니다.
  • aws_ssm: AWS Systems Manager Parameter Store에서 name을 읽습니다. 선택적 region, with_decryption, ttl, failure_ttl이 지원됩니다. with_decryption의 기본값은 true이며, 이는 SecureString 매개변수에 기대되는 설정입니다.
  • 1password: 1Password 서비스 계정 토큰을 사용하여 secret_ref (op://vault/item/[section/]field 참조)를 해석합니다. 토큰은 OP_SERVICE_ACCOUNT_TOKEN에서 읽습니다. 선택적 ttl 및 failure_ttl이 지원됩니다.
  • 1password_connect: 동일한 op://vault/item/[section/]field secret_ref를 자체 호스팅 1Password Connect 서버에 대해 해석합니다. 서버 URL은 OP_CONNECT_HOST에서, API 토큰은 OP_CONNECT_TOKEN에서 읽습니다. 선택적 ttl 및 failure_ttl이 지원됩니다.
  • in
    matches
    when
  • 감사. 관찰된 모든 JSON-RPC 메시지는 감사 로그 항목의 새 mcp 섹션에 기록됩니다: 서버 이름, 방향(request 또는 response), 메서드, 도구, 결정(allow, deny 또는 filtered), 거부 사유 및 필터 이벤트에서 제거된 도구 수.