@bifos/nhncloud-cli 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,14 +1,32 @@
1
1
  {
2
2
  "name": "@bifos/nhncloud-cli",
3
- "version": "0.18.0",
4
- "description": "CLI tool for NHN Cloud services — AI agent & terminal friendly",
3
+ "version": "0.19.0",
4
+ "description": "CLI for NHN Cloud (Compute, Network, Kubernetes, Load Balancer, Log & Crash, Deploy, Secure Key Manager and more) — AI agent & terminal friendly",
5
5
  "keywords": [
6
6
  "nhncloud",
7
7
  "cli",
8
8
  "logncrash",
9
9
  "deploy",
10
- "nhn"
10
+ "nhn",
11
+ "nhn-cloud",
12
+ "openstack",
13
+ "compute",
14
+ "kubernetes",
15
+ "nks",
16
+ "load-balancer",
17
+ "log-and-crash",
18
+ "secure-key-manager",
19
+ "ai-agent",
20
+ "claude-code"
11
21
  ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/jon890/nhncloud-cli.git"
25
+ },
26
+ "homepage": "https://github.com/jon890/nhncloud-cli#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/jon890/nhncloud-cli/issues"
29
+ },
12
30
  "bin": {
13
31
  "nhncloud": "dist/index.js"
14
32
  },
@@ -17,6 +35,7 @@
17
35
  "skills",
18
36
  "README.md"
19
37
  ],
38
+ "packageManager": "pnpm@11.18.0",
20
39
  "engines": {
21
40
  "node": ">=20"
22
41
  },
@@ -27,7 +46,9 @@
27
46
  "build": "tsup",
28
47
  "dev": "tsup --watch",
29
48
  "test": "vitest run --passWithNoTests",
30
- "test:watch": "vitest"
49
+ "test:watch": "vitest",
50
+ "verify:package": "node scripts/verify-package.mjs",
51
+ "check:pii": "node scripts/check-pii.mjs"
31
52
  },
32
53
  "license": "MIT",
33
54
  "dependencies": {
@@ -6,7 +6,7 @@ description: >-
6
6
  Claude Code 공개 스킬의 상태를 확인하거나
7
7
  `skills status|install|update|uninstall`로 관리하고 상태별 복구 방법을 안내할 때도 사용한다.
8
8
  Log & Crash, Deploy, Compute, Network, Block Storage, Floating IP,
9
- Load Balancer, NCR, NKS, NCS, API Gateway 작업을 서비스별 참조와 명령 카탈로그로 안내한다.
9
+ Load Balancer, NCR, NKS, NCS, API Gateway, Secure Key Manager 작업을 서비스별 참조와 명령 카탈로그로 안내한다.
10
10
  ---
11
11
 
12
12
  # nhncloud-cli
@@ -17,7 +17,7 @@ description: >-
17
17
  2. 정확한 경로·인수·옵션이 필요하면 `nhncloud commands --json`에서 해당 명령을 찾는다.
18
18
  3. 조회 명령을 `--json`으로 실행해 대상 식별자와 현재 상태를 확인한다.
19
19
  4. 쓰기 명령은 대상, `--profile`, 필요한 `--region`을 명시하고, 명령이 지원하면 `--yes`를 API 호출 전에 전달한다.
20
- 5. 결과는 stdout의 구조화 데이터로 판정하고 stderr는 진행 상황과 진단에 사용한다.
20
+ 5. 결과는 stdout의 구조화 데이터로 판정하고 stderr는 진행 상황과 진단에 사용한다. 파이프라인에는 stdout만 다음 명령에 넘기고 stderr는 진단 로그로 분리한다.
21
21
  6. 실패하면 [troubleshooting.md](references/troubleshooting.md)에서 종료 코드와 인증 모델을 확인한다.
22
22
 
23
23
  `--quiet`는 해당 명령이 핵심 값 한 줄 출력을 문서화한 경우에만 사용한다.
@@ -37,4 +37,5 @@ description: >-
37
37
  | Kubernetes Service | [nks.md](references/nks.md) |
38
38
  | Container Service | [ncs.md](references/ncs.md) |
39
39
  | API Gateway 조회·변경·배포·Swagger export | [apigateway.md](references/apigateway.md) |
40
+ | Secure Key Manager 키·키 저장소·인증 정보 관리, 기밀 데이터·암복호화·서명 검증 | [skm.md](references/skm.md) |
40
41
  | 인증·profile·region·출력·검색 제한 문제 해결 | [troubleshooting.md](references/troubleshooting.md) |
@@ -1,16 +1,12 @@
1
1
  # API Gateway 조회·변경 안내
2
2
 
3
- `apigateway` 명령군은 API Gateway 서비스, 리소스, 스테이지, 배포 이력을 조회하고 스테이지의 Swagger를 내보낸다.
4
- 스테이지의 백엔드 URL·설명 수정과 리소스 경로·메서드 플러그인 설정도 지원한다.
3
+ `apigateway` 명령군은 API Gateway 서비스, 리소스, 스테이지, 배포 이력을 다룬다.
5
4
 
6
5
  ## 인증과 설정
7
6
 
8
7
  공통 UAK와 API Gateway `appKey`가 필요하다.
9
8
  `nhncloud configure --apigateway-appkey <appkey>`로 `profile`의 `apigateway.appkey`를 설정한다.
10
9
 
11
- API 요청은 공통 UAK로 발급한 Bearer 토큰을 `X-NHN-Authorization` 헤더에 담는다.
12
- 표준 `Authorization` 헤더가 아니므로 직접 API를 호출할 때 혼동하지 않는다.
13
-
14
10
  지원 `region`은 `kr1`, `kr2`, `kr3`이며 기본값은 `kr1`이다.
15
11
 
16
12
  ```bash
@@ -80,7 +76,7 @@ nhncloud apigateway service list --region kr1 --json
80
76
 
81
77
  ## 반영·배포·롤백
82
78
 
83
- 리소스 변경이 트래픽에 적용되려면 서비스 리소스를 스테이지로 반영한 뒤 스테이지를 배포하는 두 단계를 거친다.
79
+ 리소스 변경이 트래픽에 적용되려면 서비스 리소스를 스테이지로 반영한 뒤 스테이지를 배포하는 순서를 거친다.
84
80
  반영·배포·롤백 명령은 모두 API 호출 전에 `--yes`가 필요하다.
85
81
 
86
82
  ```text
@@ -1,18 +1,10 @@
1
1
  # Common Reference
2
2
 
3
- CLI와 공개 스킬 설치, configure, profile, 출력 모드, 에러 코드를 다룬다.
3
+ 공개 스킬 관리, configure, profile, 출력 모드, 에러 코드를 다룬다.
4
4
  서비스별 세부 명령은 각 reference를 읽는다.
5
5
 
6
- ## 설치
7
-
8
- ```bash
9
- npm install -g @bifos/nhncloud-cli
10
- ```
11
-
12
6
  ## Claude Code 공개 스킬 관리
13
7
 
14
- 전역 설치한 CLI나 `npx`로 패키지의 공개 스킬을 관리 저장소에 설치할 수 있다.
15
- 관리 저장소는 실행 중인 npm 패키지 경로와 분리되므로 `npx`의 임시 패키지 경로가 사라져도 활성 스킬은 유지된다.
16
8
 
17
9
  ```bash
18
10
  # 전역 설치한 CLI에서 설치
@@ -75,7 +67,7 @@ nhncloud skills uninstall --quiet
75
67
 
76
68
  공공망 profile에는 `~/.nhncloud/credentials.json`의 해당 profile 블록에 `"environment": "gov"`를 명시한다.
77
69
  기존 profile은 이 필드를 생략하면 일반망을 사용한다.
78
- 현재 공공망 endpoint 선택 대상은 OAuth, Deploy, NCR, IaaS이며 공공망에서 주소가 확인되지 않은 API는 호출하지 않는다.
70
+ 공공망에서 주소가 확인되지 않은 API는 호출하지 않는다.
79
71
  `configure`의 연결 테스트는 일반망 주소를 사용한다. 공공망 자격증명은 `--no-verify`로 저장하고, profile에 `environment`를 추가한 뒤 조회 명령으로 확인한다.
80
72
 
81
73
  ```bash
@@ -90,6 +82,7 @@ nhncloud configure \
90
82
  --uak-id <uak-id> --uak-secret <uak-secret> \
91
83
  --logncrash-appkey <appkey> \
92
84
  --ncr-appkey <appkey> \
85
+ --skm-appkey <appkey> \
93
86
  --no-verify
94
87
  ```
95
88
 
@@ -166,8 +159,7 @@ HTTP 요청 상한과는 다른 설정이므로 서로 대체하지 않는다.
166
159
 
167
160
  ## Command catalog
168
161
 
169
- `nhncloud commands`는 Commander tree에서 command path, argument, option, description을 출력한다.
170
- 외부 API를 호출하지 않는 read-only metadata 명령이다.
162
+ `nhncloud commands`는 command path, argument, option, description을 출력한다. 외부 API를 호출하지 않는다.
171
163
 
172
164
  ```bash
173
165
  nhncloud commands
@@ -175,16 +167,14 @@ nhncloud commands --json
175
167
  nhncloud commands --json | jq '.commands[] | select(.path=="nks cluster list")'
176
168
  ```
177
169
 
178
- AI 에이전트는 먼저 `commands --json`으로 실제 command path와 option 이름을 확인하고, 그다음 서비스 reference를 읽는다.
179
-
180
170
  ## 되돌릴 수 없는 명령
181
171
 
182
172
  되돌릴 수 없거나 서비스를 중단시키는 명령이다. 실행 전에 대상과 변경 범위를 조회한다. 확인 방식은 명령마다 다르다.
183
173
 
184
174
  | 확인 방식 | 명령 |
185
175
  |---|---|
186
- | TTY 여부와 관계없이 `--yes` 필수 | `apigateway stage update`, `apigateway stage import-resources`, `apigateway stage deploy create`, `apigateway stage deploy rollback`, `apigateway resource set-path-plugin`, `apigateway resource set-method-plugin` (`--dry-run` 제외), `loadbalancer ipacl delete`, `loadbalancer ipacl target add`, `loadbalancer ipacl target remove`, `loadbalancer set-ipacl`, `loadbalancer clear-ipacl`, `network security-group delete`, `network security-group rule delete`, `instance security-group add`, `instance security-group remove` |
176
+ | TTY 여부와 관계없이 `--yes` 필수 | `apigateway stage update`, `apigateway stage import-resources`, `apigateway stage deploy create`, `apigateway stage deploy rollback`, `apigateway resource set-path-plugin`, `apigateway resource set-method-plugin` (`--dry-run` 제외), `loadbalancer ipacl delete`, `loadbalancer ipacl target add`, `loadbalancer ipacl target remove`, `loadbalancer set-ipacl`, `loadbalancer clear-ipacl`, `network security-group delete`, `network security-group rule delete`, `instance security-group add`, `instance security-group remove`, `skm key delete`, `skm key purge`, `skm keystore delete`, `skm keystore auth delete`, `skm keystore auth purge` |
187
177
  | 비대화형 환경에서는 `--yes` 필수, TTY에서는 확인 질문 | `instance delete`, `floatingip delete`, `nks cluster delete`, `nks cluster addon remove`, `nks nodegroup delete`, `ncs template delete`, `ncs template version delete`, `ncs workload delete` |
188
- | 확인 질문과 `--yes` 없음 | `instance keypair delete`, `deploy run`, `nks cluster resize --nodes-to-remove`, `nks nodegroup upgrade`, `ncs workload update` (PUT 전체 교체), `instance volume detach`, `instance resize`, `instance stop`, `instance reboot`, `nks nodegroup update-flavor`, `nks cluster set-ipacl`, `nks cluster set-control-plane-log`, `nks cluster update-sgw`, `ncs workload patch` (JSON Patch `remove` 포함 가능) |
178
+ | 확인 질문과 `--yes` 없음 | `instance keypair delete`, `deploy run`, `nks cluster resize --nodes-to-remove`, `nks nodegroup upgrade`, `ncs workload update` (PUT 전체 교체), `instance volume detach`, `instance resize`, `instance stop`, `instance reboot`, `nks nodegroup update-flavor`, `nks cluster set-ipacl`, `nks cluster set-control-plane-log`, `nks cluster update-sgw`, `ncs workload patch` (JSON Patch `remove` 포함 가능), `nks nodegroup stop-node` (지정 노드 중지), `ncs workload pause` (workload 일시정지), `ncs workload restart` (task 재시작), `instance resize-confirm` (새 flavor로 고정, 이후 `resize-revert` 불가), `skm secret update` (기밀 데이터 값 교체), `skm keystore update` (실행 위치가 키를 쓰지 못하게 될 수 있으므로 먼저 `skm confirm`) |
189
179
 
190
180
  `nks cluster resize`는 `--nodes-to-remove`를 생략해도 확인 없이 실행되며, 감축 대상 노드를 API가 선택할 수 있다는 경고를 출력한다.
@@ -4,7 +4,6 @@
4
4
 
5
5
  `~/.nhncloud/credentials.json`에 profile 공통 `userAccessKey`가 필요하다.
6
6
  appkey는 `nhncloud configure --deploy-appkey <key>`로 profile에 설정한다.
7
- `nhncloud configure` 사용을 권장한다.
8
7
  공공망에서는 profile에 `"environment": "gov"`를 명시하고 `--profile`로 선택한다.
9
8
 
10
9
  배포 좌표(아티팩트·서버그룹·시나리오 등)는 config에 두지 않는다.
@@ -142,9 +142,8 @@ nhncloud loadbalancer ipacl target remove <target-id> \
142
142
 
143
143
  ## stdout과 stderr
144
144
 
145
- - 테이블, JSON, UUID, 정상 빈 결과는 stdout에 출력한다.
146
- - 진행 상황, 운영 경고, 오류는 stderr에 출력한다.
147
- - 파이프라인에서는 stdout만 다음 명령에 전달하고 stderr는 진단 로그로 분리한다.
145
+ stdout과 stderr 분리 규칙은 [SKILL.md](../SKILL.md)를 따른다.
146
+
148
147
  - 부분 실패에서도 JSON 또는 UUID를 stdout에 먼저 출력한 뒤 stderr에 복구 안내를 출력한다.
149
148
 
150
149
  ## 부분 실패 복구
@@ -3,6 +3,7 @@
3
3
  `logncrash` 명령군은 Log & Crash Search v3 조회 토큰 확인, 커서 검색, scroll export, collector 전송을 다룬다.
4
4
 
5
5
  조회 토큰 확인, 검색과 export에는 profile의 logncrash appkey와 공통 UAK가 필요하다.
6
+ 기존 `logncrash.secret`은 Search v3 인증에 사용하지 않는다.
6
7
  CLI가 UAK를 OAuth 토큰으로 교환해 Bearer 인증을 적용한다.
7
8
  `send`는 별도 collector 계약이므로 Search v3 전환의 영향을 받지 않는다.
8
9
 
@@ -45,6 +46,7 @@ API 제약:
45
46
 
46
47
  - 검색 시작은 최근 90일 이내여야 한다.
47
48
  - 검색 범위는 31일 이하여야 한다.
49
+ - 검색 `--size`는 1부터 100까지 허용한다.
48
50
  - 문서상 제약보다 짧은 기간에서도 서버가 500 응답을 낼 수 있다. 처리 가능한 기간의
49
51
  경계는 프로젝트의 로그 양에 따라 달라진다.
50
52
 
@@ -127,14 +129,9 @@ CLI는 자동으로 다시 시도하지 않는다.
127
129
 
128
130
  **재시도할 때 오류를 구분한다.**
129
131
  조회 횟수 제한은 토큰 회복 뒤 다시 시도할 수 있고, 서버 500은 export의 기간 분할 대상이다.
130
- 입력 오류와 설정 오류는 기다려도 풀리지 않는다.
131
-
132
- | 종료 코드 | 의미 | 기다리면 풀리나 |
133
- |---|---|---|
134
- | 1 | API 오류, 봉투 실패 (조회 횟수 제한 포함) | 오류에 따라 다르다 |
135
- | 2 | 인증 실패 | 아니다 |
136
- | 3 | 입력 오류 | 아니다 |
137
- | 4 | 설정 오류 | 아니다 |
132
+ 종료 코드 1(API 오류, 조회 횟수 제한 포함)은 오류에 따라 기다리면 풀릴 수 있다.
133
+ 종료 코드 2(인증 실패), 3(입력 오류), 4(설정 오류)는 기다려도 풀리지 않는다.
134
+ 종료 코드 표는 [troubleshooting.md](troubleshooting.md#exit-code)가 소유한다.
138
135
 
139
136
  **고정 간격 대신 매번 잔량을 확인한다.**
140
137
  호출 비용은 쿼리마다 다르고 한 번에 큰 음수로 내려갈 수 있다.
@@ -161,7 +158,7 @@ scroll 시작이나 계속 요청에서 서버가 500 응답을 반환하면 CLI
161
158
 
162
159
  더 나눌 수 없는 기간에서도 500 응답이 계속되거나 다른 오류가 발생하면 CLI가 원본
163
160
  오류를 보존한다.
164
- `--size`는 v3 scroll의 페이지 크기를 제어하지 않는다.
161
+ `--size`는 v3 scroll의 페이지 크기를 제어하지 않는 폐기 예정 호환 옵션이다. 10부터 100까지만 검증하고 경고한 뒤 v3 요청에서는 무시한다.
165
162
 
166
163
  조회 횟수 제한을 만나면 기간을 나누지 않고 즉시 멈춘다.
167
164
  나눌수록 호출이 늘어 제한을 더 소모하기 때문이다.
@@ -60,7 +60,7 @@ nhncloud ncs workload events <workload-id> --task <task-id> --type Warning --jso
60
60
 
61
61
  ### logs·events 시간 필터
62
62
 
63
- `--from`과 `--to`는 다음 두 형식을 받는다.
63
+ `--from`과 `--to`는 다음 형식을 받는다.
64
64
 
65
65
  - 시간대와 초를 포함한 RFC3339 절대시간
66
66
  - `now`
@@ -88,7 +88,7 @@ nhncloud ncs workload logs <workload-id> \
88
88
  ```
89
89
 
90
90
  CLI는 입력을 API 호출 전에 `YYYY-MM-DDTHH:mm:ssZ` 형식으로 정규화하고 소수 초를 제거한다.
91
- 두 옵션을 모두 생략하면 API 기본 범위를 사용한다.
91
+ `--from`과 `--to`를 모두 생략하면 API 기본 범위를 사용한다.
92
92
  한쪽만 지정하면 지정한 필드만 API에 전달한다.
93
93
 
94
94
  존재하지 않는 날짜, 시간대 없는 절대시간, 지원하지 않는 상대시간 단위, `from > to`는 종료 코드 3으로 거부한다.
@@ -118,7 +118,7 @@ nhncloud ncs workload delete <workload-id> --yes
118
118
 
119
119
  생성은 비동기다.
120
120
  `--wait`를 주면 `Running` 상태가 될 때까지 폴링하고, `--timeout <sec>`(기본 300)으로 대기 시간을 조절한다.
121
- 변경은 `update`(PUT, 전체 교체)와 `patch`(PATCH, JSON Patch 배열 부분 변경) 두 가지다.
121
+ 변경은 `update`(PUT, 전체 교체)와 `patch`(PATCH, JSON Patch 배열 부분 변경)다.
122
122
 
123
123
  ```bash
124
124
  nhncloud ncs workload create --file ./workload-create.json --json
@@ -95,7 +95,7 @@ control plane 이 먼저 올라가야 워커의 대상 버전이 생기기 때
95
95
 
96
96
  ### 워커 업그레이드 중 서비스 영향 조절
97
97
 
98
- 두 옵션은 워커 업그레이드에만 의미가 있고 기본값은 모두 1이다.
98
+ 두 옵션은 `nodegroup upgrade`와 `nodegroup update-flavor`에서 받고 기본값은 모두 1이다.
99
99
 
100
100
  - `--num-buffer-nodes <n>`: 축출된 파드를 다시 받아 줄 여유 노드 수. 업그레이드가 끝나면 자동 삭제되지만 그동안 인스턴스 요금이 청구된다. 0으로 두면 기존 노드만으로 재배치해야 해 실패 위험이 커진다.
101
101
  - `--num-max-unavailable-nodes <n>`: 한 번에 서비스 불가 상태로 둘 노드 수. 크게 잡으면 빨라지고 가용성이 낮아진다.
@@ -0,0 +1,118 @@
1
+ # Secure Key Manager 명령 안내
2
+
3
+ `skm` 명령군은 Secure Key Manager의 키 저장소, 키, 인증 정보, 기밀 데이터를 다룬다.
4
+
5
+ ## 인증과 설정
6
+
7
+ 공통 UAK와 SKM `appKey`가 필요하다.
8
+ `nhncloud configure --skm-appkey <appkey>`로 profile의 `skm.appkey`를 설정한다.
9
+
10
+ 공공망은 profile의 `"environment": "gov"`로 고른다.
11
+
12
+ ## 클라이언트 인증
13
+
14
+ 키 저장소에 등록한 클라이언트 인증 정보와 호출 환경이 맞아야 키와 데이터를 읽을 수 있다.
15
+ CLI는 IPv4 인증과 MAC 인증을 지원한다. 인증서 인증 정보 등록(`auth add --type certificate`)은 지원하지만, CLI가 클라이언트 인증서를 보내 인증하는 것은 지원하지 않는다.
16
+
17
+ - IPv4 인증은 서버가 본 요청 출발지 IP가 키 저장소에 등록돼 있어야 한다. 이 IP는 공인 IP와 다를 수 있다.
18
+ - 사내망처럼 내부 경로로 SKM endpoint에 닿는 환경에서는 서버에 사설 IP(예: `10.x.x.x`)로 보인다. 이때 공인 IP만 등록하면 `ipv4 auth failure`로 실패한다.
19
+ - 허용 IP는 `nhncloud skm confirm`의 `clientIp`를 기준으로 등록한다. 출발지 IP가 바뀔 수 있으면 `skm keystore auth add <keystore-id> <대역>/24 --type ipv4`처럼 CIDR 대역으로 등록한다.
20
+ - CLI는 `/0`부터 `/32`까지 받는다. `0.0.0.0/0`은 모든 출발지를 허용하므로 등록하지 않는다.
21
+ - 대역은 `10.0.0.0/24`처럼 호스트 비트를 0으로 맞춰 등록한다. 지울 때는 `auth list --type ipv4`에 나온 값을 `auth delete`에 그대로 넘긴다.
22
+ - MAC 인증을 켠 키 저장소는 `--mac-address aa:bb:cc:dd:ee:ff`로 MAC을 넘긴다. 콜론 형식만 받고 소문자로 바꿔 보낸다.
23
+ - `nhncloud skm confirm`은 서버가 본 클라이언트 IP와 MAC 헤더를 보여 준다. 인증 오류가 나면 먼저 확인한다.
24
+
25
+ ## 명령 탐색
26
+
27
+ 정확한 명령 경로와 옵션은 `nhncloud commands --json`에서 확인한다.
28
+
29
+ ```bash
30
+ nhncloud skm keystore list
31
+ nhncloud skm key list <keystore-id>
32
+ nhncloud skm key list <keystore-id> --status active # active|inactive 로 거른다
33
+ nhncloud skm secret get <key-id> --quiet
34
+ ```
35
+
36
+ `--quiet`가 출력하는 값은 다음과 같다.
37
+
38
+ - `keystore list`·`keystore get`: `keyStoreId`
39
+ - `key list`·`key get`: `keyId`
40
+ - `secret get`: 기밀 데이터
41
+ - `symmetric-key get`: 대칭키 원문
42
+ - `symmetric-key encrypt`: 암호문
43
+ - `symmetric-key decrypt`: 평문
44
+ - `asymmetric-key sign`: 서명값
45
+ - `asymmetric-key public-key`·`private-key`: `standardEncodedKey`(PKCS#8), 응답에 없으면 `encodedKey`. 일반망 문서의 응답에는 `standardEncodedKey`가 없다.
46
+ - `symmetric-key create-local-key`: 평문 키와 암호화된 키 두 줄
47
+ - `asymmetric-key verify`: 출력 없음
48
+ - `key create`·`secret update`·`key delete|purge`: `keyId`
49
+ - `keystore create|update|delete`: `keyStoreId`
50
+ - `keystore auth add|delete|purge`: 입력한 IPv4·MAC 값(소문자로 정규화) 또는 인증서 이름
51
+ - `keystore auth get`: 조회한 인증 정보의 값 또는 인증서 이름
52
+
53
+ ## 쓰기 명령
54
+
55
+ 처음 구성하는 순서 예시는 다음과 같다.
56
+
57
+ ```bash
58
+ nhncloud skm keystore create --name <name> --auth ipv4
59
+ nhncloud skm keystore auth add <keystore-id> 10.0.0.1 --type ipv4
60
+ nhncloud skm keystore auth add <keystore-id> 10.0.0.0/24 --type ipv4 # CIDR 대역도 등록할 수 있다
61
+ printf '%s' "$SECRET" | nhncloud skm key create <keystore-id> --type secret --name <name>
62
+ ```
63
+
64
+ - 키 저장소는 `<keystore-id>`로 지정하고, CLI가 키 저장소 이름을 조회해 요청에 넣는다.
65
+ - 기밀 데이터 값(`key create --type secret`, `secret update`)은 `--value`, `--file`, 표준 입력 중 하나로 넘긴다. `--value`로 넘긴 값은 셸 히스토리와 프로세스 목록에 남으므로 비밀값은 `--file`이나 표준 입력으로 넘긴다.
66
+ - `keystore update`는 주지 않은 값을 현재 값으로 채운다. 조회 응답에 인증 결합 방식이 없으므로 `--auth-mode`는 매번 필수다. `--description`에 공백만 주면 현재 설명을 유지하며 설명을 지우는 경로는 없다.
67
+ - `delete`는 7일 뒤 삭제되고 콘솔에서 취소할 수 있다. `purge`는 삭제가 예약된 대상만 즉시 지우며 되돌릴 수 없다. 모든 삭제 명령에 `--yes`가 필요하다.
68
+ - 인증 정보를 지우거나 인증 설정을 바꾸기 전에 `nhncloud skm confirm`으로 현재 IP·MAC을 확인한다. 실행 위치가 키를 쓰지 못하게 될 수 있다.
69
+ - 인증서 추가는 `--life-time <days>`가 필수다. 비밀번호는 `--password` 대신 `--password-file`이나 표준 입력을 권장하며, 끝 줄바꿈(`\n` 또는 `\r\n`) 하나를 지운다.
70
+ - 대칭키·비대칭키는 자동 회전 없이 만들어진다. 자동 회전은 콘솔에서 설정한다.
71
+ - MAC 값은 소문자로 바꿔 보내므로 콘솔에서 대문자로 등록한 MAC은 CLI로 지우지 못할 수 있다.
72
+
73
+ ## 입력과 크기 한도
74
+
75
+ 암복호화·서명·검증 명령의 입력은 `--plaintext`·`--ciphertext`, `--file`, 표준 입력 순서로 고른다.
76
+
77
+ - `--plaintext`로 넘긴 값은 셸 히스토리와 프로세스 목록에 남는다. 비밀 평문은 `--file`이나 표준 입력으로 넘긴다.
78
+ - 입력의 끝 줄바꿈과 BOM을 지우지 않는다. 줄바꿈 없는 값은 `echo` 대신 `printf`로 넘긴다.
79
+ - 크기 한도는 명령마다 다르다.
80
+ - `symmetric-key encrypt`: 평문 32KB(32768바이트)
81
+ - `symmetric-key decrypt`: 암호문 1MB(1,000,000바이트)
82
+ - `asymmetric-key sign`·`verify`: 245바이트, `--standard`를 주면 64KB(65536바이트)
83
+ - `key create --type secret`·`secret update`: 기밀 데이터 값 1MB(1,000,000바이트)
84
+ - 인증서 비밀번호: 1024바이트
85
+ - `--standard`는 바이너리 입력을 base64로 바꿔 보낸다.
86
+
87
+ ```bash
88
+ printf 'hello' | nhncloud skm symmetric-key encrypt <key-id> --quiet
89
+ ```
90
+
91
+ ## 비밀값 출력
92
+
93
+ 비밀값을 출력하는 명령은 값을 숨기지 않는다.
94
+ `--quiet`는 원문 뒤에 줄바꿈 하나를 붙이고, `--json`은 응답 그대로, 기본 출력은 제어 문자만 `?`로 바꾼 값을 낸다.
95
+ 입력은 끝 줄바꿈을 지우지 않으므로 `--quiet` 출력을 다른 skm 명령의 입력으로 넘기면 그 줄바꿈까지 암호화·서명된다.
96
+ 원문만 넘기려면 `--json` 출력에서 줄바꿈 없이 값을 꺼낸다.
97
+
98
+ ```bash
99
+ nhncloud skm secret get <key-id> --json | jq -j '.secret' > secret.txt
100
+ ```
101
+ 인증서 인증 상세의 `password`는 `***`로 가린다.
102
+ `secret update`는 바꾼 값을 출력하지 않는다.
103
+ `symmetric-key get`은 대칭키 원문을 stdout에 낸다.
104
+ `key get`, `keystore get`, `keystore auth get`은 메타데이터만 출력하고 키 원문과 인증서 비밀번호는 내지 않는다.
105
+ 비밀값 명령의 stdout을 로그나 이슈, 채팅에 붙이지 않는다.
106
+
107
+ ## 서명 검증 종료 코드
108
+
109
+ `asymmetric-key verify`는 검증 결과가 `false`면 종료 코드 1을 반환한다.
110
+ `--quiet`에서는 stdout이 비어 있으므로 종료 코드로 판단한다.
111
+
112
+ ```bash
113
+ if nhncloud skm asymmetric-key verify <key-id> --plaintext hello --signature <signature>; then
114
+ echo ok
115
+ fi
116
+ ```
117
+
118
+ `--standard` 검증에 넘길 `--key-version`은 `asymmetric-key sign --standard --json` 출력의 `keyVersion`에서 얻는다.
@@ -15,22 +15,24 @@
15
15
 
16
16
  ## 인증 모델
17
17
 
18
- | 서비스 | 비밀 | 인증 방식 |
19
- |--------|------|-----------|
20
- | Log & Crash 검색/export | appkey 와 공통 UAK id/secret | UAK OAuth `X-NHN-Authorization: Bearer <token>` |
21
- | Log & Crash send | appkey | body `projectName=appkey`, 인증 헤더 없음 |
22
- | Deploy | UAK id 와 secret, Deploy appkey | OAuth Bearer token |
23
- | Instance/network/volume/floatingip | tenantId, username, API password | Keystone `X-Auth-Token` |
24
- | NKS | tenantId, username, API password | Keystone `X-Auth-Token` 과 container-infra API version |
25
- | NCR registry | UAK id, secret, NCR appkey | `X-TC-AUTHENTICATION-*` |
26
- | NCR images/tags | UAK id 와 secret | HTTP Basic Auth to Harbor REST |
27
- | NCS | UAK id 와 secret, NCS appkey | OAuth Bearer token (`X-NHN-Authorization`) |
28
- | API Gateway | UAK id 와 secret, API Gateway appkey | OAuth Bearer token (`X-NHN-Authorization`) |
18
+ | 서비스 | 비밀 |
19
+ |--------|------|
20
+ | Log & Crash 검색/export | appkey 와 공통 UAK id/secret |
21
+ | Log & Crash send | appkey |
22
+ | Deploy | UAK id 와 secret, Deploy appkey |
23
+ | Instance/network/volume/floatingip | tenantId, username, API password |
24
+ | NKS | tenantId, username, API password |
25
+ | NCR registry | UAK id, secret, NCR appkey |
26
+ | NCR images/tags | UAK id 와 secret |
27
+ | NCS | UAK id 와 secret, NCS appkey |
28
+ | API Gateway | UAK id 와 secret, API Gateway appkey |
29
+ | Secure Key Manager | UAK id 와 secret, SKM appkey, 키 저장소 IPv4·MAC 인증 |
29
30
 
30
31
  ## Exit code
31
32
 
32
33
  | exit code | 의미 | 대표 원인 |
33
34
  |-----------|------|-----------|
35
+ | 0 | 성공 | 요청이 끝났고 출력이 완결됐다 |
34
36
  | 1 | API 오류 | 4xx/5xx, 봉투 실패, wait timeout |
35
37
  | 2 | 인증 실패 | UAK/secret/password 오류, 권한 부족 |
36
38
  | 3 | 입력 오류 | 필수 옵션 누락, region 미지원, 시간 범위 초과, `--yes` 누락 |
@@ -67,26 +69,8 @@ nhncloud ncr list --json | jq '.[0] | keys'
67
69
 
68
70
  ## Log & Crash 검색 제한
69
71
 
70
- - `--from`은 최근 90일 이내여야 한다.
71
- - `--to - --from` 범위는 31일 이하여야 한다.
72
- - `--page`는 0만 허용한다. 다음 페이지는 JSON의 `nextCursor`를 `--cursor`로 그대로 전달한다.
73
- - 검색 `--size`는 1부터 100까지 허용한다.
74
- - export `--size`는 폐기 예정 호환 옵션이며 10부터 100까지 검증 후 경고하고 v3 요청에서는 무시한다.
75
- - export가 중간 실패하면 보존된 원본 오류를 확인하고 검색 범위를 줄여 다시 실행한다.
76
-
77
- 검색 또는 export에서 설정 오류가 나면 profile에 다음 두 값이 모두 있는지 확인한다.
78
-
79
- - `userAccessKey.id`와 `userAccessKey.secret`
80
- - `logncrash.appkey`
81
-
82
- 기존 `logncrash.secret`은 Search v3 인증에 사용하지 않는다.
72
+ 검색 기간·`--size`·`--page`·export 제한은 [logncrash.md](logncrash.md)를 따른다.
83
73
 
84
74
  ## 쓰기 명령 확인
85
75
 
86
76
  명령별 확인 방식은 [되돌릴 수 없는 명령](common.md#되돌릴-수-없는-명령)에서 확인한다.
87
-
88
- ## stdout/stderr 분리
89
-
90
- 데이터는 stdout에 출력된다.
91
- 진행 상황, 저장 완료, 성공 메시지, 에러는 stderr에 출력된다.
92
- 스크립트에서 stdout만 파싱하고 stderr는 로그로 분리한다.