@bifos/nhncloud-cli 0.19.0 → 0.21.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/README.md +12 -5
- package/dist/index.js +1207 -297
- package/package.json +4 -3
- package/skills/nhncloud-cli/SKILL.md +1 -1
- package/skills/nhncloud-cli/references/common.md +128 -11
- package/skills/nhncloud-cli/references/skm.md +32 -0
- package/skills/nhncloud-cli/references/troubleshooting.md +3 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bifos/nhncloud-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
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",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
],
|
|
38
38
|
"packageManager": "pnpm@11.18.0",
|
|
39
39
|
"engines": {
|
|
40
|
-
"node": ">=20"
|
|
40
|
+
"node": ">=20.18.1"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"access": "public"
|
|
@@ -58,7 +58,8 @@
|
|
|
58
58
|
"cli-table3": "^0.6.5",
|
|
59
59
|
"commander": "^14.0.3",
|
|
60
60
|
"ky": "^1.14.3",
|
|
61
|
-
"ora": "^9.3.0"
|
|
61
|
+
"ora": "^9.3.0",
|
|
62
|
+
"undici": "^7.29.1"
|
|
62
63
|
},
|
|
63
64
|
"devDependencies": {
|
|
64
65
|
"@types/node": "^25.5.0",
|
|
@@ -3,7 +3,7 @@ name: nhncloud-cli
|
|
|
3
3
|
description: >-
|
|
4
4
|
NHN Cloud 리소스를 nhncloud CLI로 조회·생성·변경·삭제하거나,
|
|
5
5
|
configure·profile·출력 형식·종료 코드·명령 문법을 확인할 때 사용한다.
|
|
6
|
-
Claude Code 공개 스킬의 상태를 확인하거나
|
|
6
|
+
Claude Code·Codex 공개 스킬의 상태를 확인하거나
|
|
7
7
|
`skills status|install|update|uninstall`로 관리하고 상태별 복구 방법을 안내할 때도 사용한다.
|
|
8
8
|
Log & Crash, Deploy, Compute, Network, Block Storage, Floating IP,
|
|
9
9
|
Load Balancer, NCR, NKS, NCS, API Gateway, Secure Key Manager 작업을 서비스별 참조와 명령 카탈로그로 안내한다.
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
공개 스킬 관리, configure, profile, 출력 모드, 에러 코드를 다룬다.
|
|
4
4
|
서비스별 세부 명령은 각 reference를 읽는다.
|
|
5
5
|
|
|
6
|
-
## Claude Code 공개 스킬 관리
|
|
6
|
+
## Claude Code·Codex 공개 스킬 관리
|
|
7
7
|
|
|
8
|
+
설치 경로는 Claude Code 의 `~/.claude/skills/nhncloud-cli` 와 Codex 의 `~/.agents/skills/nhncloud-cli` 다.
|
|
9
|
+
두 경로는 같은 관리 저장소를 가리킨다.
|
|
10
|
+
Codex 를 설치했는지와 관계없이 두 경로를 만들고, 필요하면 `~/.agents/skills` 디렉터리도 만든다.
|
|
11
|
+
이전에 Claude Code 경로에만 설치했다면 `nhncloud skills install` 이나 `update` 를 다시 실행해 Codex 경로를 연결한다.
|
|
8
12
|
|
|
9
13
|
```bash
|
|
10
14
|
# 전역 설치한 CLI에서 설치
|
|
@@ -29,17 +33,25 @@ nhncloud skills update
|
|
|
29
33
|
|
|
30
34
|
| 상태 | 의미 | 복구 명령 |
|
|
31
35
|
|------|------|-----------|
|
|
32
|
-
| `current` | 현재 CLI 버전과 콘텐츠
|
|
33
|
-
| `missing` | 활성 스킬이 설치되지 않음 | `nhncloud skills install` |
|
|
34
|
-
| `outdated` | 이전 버전 또는 기존 패키지·저장소 직접
|
|
35
|
-
| `broken` | 관리형 링크 또는 기존 패키지 링크의 대상이 없음 | `nhncloud skills update` |
|
|
36
|
-
| `modified` | 관리 저장소 콘텐츠가 설치 매니페스트와 다름 | 내용을 확인한 뒤 `nhncloud skills update --force` |
|
|
37
|
-
| `corrupt` | 관리 저장소 경로나 매니페스트가 손상됨 | 내용을 확인한 뒤 `nhncloud skills update --force` |
|
|
38
|
-
| `unmanaged` | 사용자가 만든 파일·디렉터리 또는 알 수 없는 링크가 설치 경로를 차지함 | 내용을 확인한 뒤 `nhncloud skills update --force` |
|
|
36
|
+
| `current` | 모든 설치 경로가 현재 CLI 버전과 콘텐츠 해시에 일치함 | 조치 없음 |
|
|
37
|
+
| `missing` | 한 경로라도 활성 스킬이 설치되지 않음 | `nhncloud skills install` |
|
|
38
|
+
| `outdated` | 한 경로라도 이전 버전 또는 기존 패키지·저장소 직접 링크임 | `nhncloud skills update` |
|
|
39
|
+
| `broken` | 한 경로라도 관리형 링크 또는 기존 패키지 링크의 대상이 없음 | `nhncloud skills update` |
|
|
40
|
+
| `modified` | 한 경로라도 관리 저장소 콘텐츠가 설치 매니페스트와 다름 | 내용을 확인한 뒤 `nhncloud skills update --force` |
|
|
41
|
+
| `corrupt` | 한 경로라도 관리 저장소 경로나 매니페스트가 손상됨 | 내용을 확인한 뒤 `nhncloud skills update --force` |
|
|
42
|
+
| `unmanaged` | 한 경로라도 사용자가 만든 파일·디렉터리 또는 알 수 없는 링크가 설치 경로를 차지함 | 내용을 확인한 뒤 `nhncloud skills update --force` |
|
|
43
|
+
|
|
44
|
+
상태는 설치 경로를 합친 값이고 위 표의 `corrupt`부터 `current` 방향으로 먼저 해당하는 값이다.
|
|
45
|
+
`status --json`의 최상위 `destination`, `linkTarget`, `managed`는 Claude Code 경로 값이다. 경로별 상세의 위치는 아래 `--json` 설명이 명령별로 정한다.
|
|
46
|
+
|
|
47
|
+
두 경로가 모두 `current` 일 때만 상태가 `current` 다.
|
|
39
48
|
|
|
40
49
|
`--force`는 사용자 항목 또는 수정·손상된 관리 저장소를 삭제하지 않고 같은 상위 디렉터리에 백업한 뒤 교체한다.
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
한 경로라도 `unmanaged`, `modified`, `corrupt` 면 `--force` 없이는 어느 경로도 바꾸지 않는다.
|
|
51
|
+
다른 링크를 거쳐 가다가 대상이 사라진 링크(예: `~/.agents/skills/nhncloud-cli` 가 없는 `~/.claude/skills/nhncloud-cli` 를 가리킴)도 `unmanaged` 로 판정한다. 링크가 가리키는 곳을 확인한 뒤 `--force` 로 교체한다.
|
|
52
|
+
한 경로의 전환이 실패하면 이미 바꾼 경로를 이전 상태로 되돌린다.
|
|
53
|
+
`nhncloud skills uninstall`은 두 설치 경로의 활성 심볼릭 링크만 제거하며 버전별 관리 저장소는 보존한다.
|
|
54
|
+
한 경로라도 사용자 파일, 실제 디렉터리, 알 수 없는 링크이면 어느 링크도 제거하지 않는다.
|
|
43
55
|
|
|
44
56
|
자동화에서는 모든 하위 명령에 전역 출력 옵션을 함께 사용할 수 있다.
|
|
45
57
|
|
|
@@ -58,8 +70,15 @@ nhncloud skills uninstall --quiet
|
|
|
58
70
|
```
|
|
59
71
|
|
|
60
72
|
`--json`은 상태·변경 여부·백업 경로처럼 자동화에 필요한 필드를 제공한다.
|
|
73
|
+
경로별 정보는 `agents.claude`, `agents.codex` 에 있고 위치는 명령마다 다르다.
|
|
74
|
+
`status` 는 최상위 `agents.*` 에 경로별 상세를 두고, 최상위 필드는 합친 `status` 를 빼면 Claude Code 경로의 상세다.
|
|
75
|
+
`install` 과 `update` 는 `status.agents.*` 에 경로별 상세를 둔다.
|
|
76
|
+
`uninstall` 은 최상위 `agents.*` 에 경로별 `action` 과 `destination` 을 둔다.
|
|
61
77
|
`--quiet`은 상태 토큰 하나만 stdout에 출력한다.
|
|
62
78
|
|
|
79
|
+
Codex 에서는 `$nhncloud-cli` 로 스킬을 부를 수 있다.
|
|
80
|
+
설치한 스킬이 Codex 에 보이지 않으면 Codex 를 다시 시작한다.
|
|
81
|
+
|
|
63
82
|
## 초기 설정
|
|
64
83
|
|
|
65
84
|
첫 설정은 `nhncloud configure`로 한다.
|
|
@@ -112,6 +131,78 @@ CLI가 UAK를 OAuth 토큰으로 교환하므로 별도 logncrash secret은 저
|
|
|
112
131
|
저장 파일은 `~/.nhncloud/credentials.json`이고 mode 0600으로 관리된다.
|
|
113
132
|
기본 profile은 선택적으로 `~/.nhncloud/config.json`의 `defaultProfile`로 지정한다.
|
|
114
133
|
|
|
134
|
+
## 설정 진단
|
|
135
|
+
|
|
136
|
+
`nhncloud doctor`는 자격증명 파일, 설정 파일, 대상 profile, 공개 스킬 상태를 진단한다.
|
|
137
|
+
기본 실행은 외부 API를 호출하지 않는다.
|
|
138
|
+
`--check-connection`을 주면 대상 profile 하나의 자격증명으로 실제 연결을 확인한다.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
nhncloud doctor
|
|
142
|
+
nhncloud doctor --json | jq .
|
|
143
|
+
nhncloud doctor --profile staging --check-connection --json
|
|
144
|
+
nhncloud doctor --quiet # ready 또는 not-ready
|
|
145
|
+
nhncloud doctor --json | jq -e '.ready' # 준비되지 않았으면 jq 가 1 로 끝난다
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
진단 보고서를 출력했으면 종료 코드는 문제가 있어도 0이다.
|
|
149
|
+
실패로 끝나야 하는 점검은 `ready` 필드로 판정한다.
|
|
150
|
+
비밀값(UAK secret, API 비밀번호, appkey)은 어떤 출력 형식에도 넣지 않는다.
|
|
151
|
+
|
|
152
|
+
`--json` 최상위 필드:
|
|
153
|
+
|
|
154
|
+
| 필드 | 값 |
|
|
155
|
+
|---|---|
|
|
156
|
+
| `schemaVersion` | `1` |
|
|
157
|
+
| `ready` | 자격증명 파일이 `ok`, 대상 profile 이 있고 자격증명 블록이 하나 이상 있으며 `environment`가 올바르고, 연결 확인을 했다면 `failed`가 없을 때 `true`. `config.state`는 반영하지 않으므로 `config.json` 손상은 `config.state`로 따로 본다 |
|
|
158
|
+
| `credentials` | `credentials.json` 진단. 아래 표 |
|
|
159
|
+
| `config` | `config.json` 진단. 아래 표 |
|
|
160
|
+
| `profile` | `{ "name": string \| null, "exists": boolean }`. `name`은 profile 해석 순서로 정한 대상이며, `config.json` 이 JSON 이 아니라 해석하지 못하면 `null` |
|
|
161
|
+
| `connection` | 연결 확인 결과. 아래 표 |
|
|
162
|
+
| `skills` | `{ "agents": { "claude": ..., "codex": ... } }`. 에이전트별 공개 스킬 상태 |
|
|
163
|
+
|
|
164
|
+
`credentials`와 `config`:
|
|
165
|
+
|
|
166
|
+
| 필드 | 값 |
|
|
167
|
+
|---|---|
|
|
168
|
+
| `path` | 파일의 절대 경로 |
|
|
169
|
+
| `state` | `ok`, `missing`, `invalid`(JSON 이 아니거나 형식이 맞지 않음), `unreadable`(권한 등으로 읽지 못함) |
|
|
170
|
+
| `reason` | `state`가 `invalid`나 `unreadable`일 때만 있는 고정 문구. 파일 내용은 담지 않는다 |
|
|
171
|
+
| `permissions` | `credentials`에만 있다. 파일이 있으면 `ok`(group·other 권한 없음), `too-open`, `unknown`(Windows) |
|
|
172
|
+
| `profiles` | `credentials`에만 있다. `[{ "name", "environment": "real" \| "gov" \| "invalid", "blocks": string[] }]`. `blocks`는 profile 안의 블록 이름(`userAccessKey`, `iaas`, `logncrash` 등)을 정렬한 목록이다 |
|
|
173
|
+
| `defaultProfile` | `config`에만 있다. `defaultProfile` 값이나 `null` |
|
|
174
|
+
|
|
175
|
+
`connection`:
|
|
176
|
+
|
|
177
|
+
| 경우 | 모양 |
|
|
178
|
+
|---|---|
|
|
179
|
+
| `--check-connection` 없음 | `{ "checked": false }` |
|
|
180
|
+
| `--check-connection` 있음 | `{ "checked": true, "profile": string \| null, "targets": { "userAccessKey", "iaas", "logncrash", "ncr", "ncs" } }` |
|
|
181
|
+
|
|
182
|
+
`targets`의 각 값은 `{ "status", "reason"?, "exitCode"? }`다.
|
|
183
|
+
|
|
184
|
+
| `status` | `reason` | 뜻 |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| `ok` | 없음 | 연결과 인증에 성공했다 |
|
|
187
|
+
| `failed` | `auth` | 인증에 실패했다. 키나 appkey를 확인한다 |
|
|
188
|
+
| `failed` | `error` | 네트워크나 API 오류로 확인하지 못했다. `exitCode`에 그 오류의 종료 코드가 있다. Log & Crash 는 조회 한도 소진도 `failed`로 보고된다 |
|
|
189
|
+
| `skipped` | `not-configured` | profile 에 그 블록이 없거나 필수 값이 비어 있다 |
|
|
190
|
+
| `skipped` | `uak-missing` | appkey 는 있지만 함께 쓰는 공통 UAK 가 없다(`logncrash`, `ncr`, `ncs`) |
|
|
191
|
+
| `skipped` | `uak-failed` | `userAccessKey` 확인이 `ok`가 아니라 UAK 로 OAuth 토큰을 받는 대상(`logncrash`, `ncs`)을 확인하지 않았다 |
|
|
192
|
+
| `skipped` | `gov-unsupported` | 공공망 profile 이라 확인하지 않았다 |
|
|
193
|
+
| `skipped` | `profile-unavailable` | 자격증명 파일을 읽지 못했거나 대상 profile 이 없거나 `environment`가 올바르지 않다 |
|
|
194
|
+
|
|
195
|
+
`ncr`과 `ncs` 확인은 `kr1` region 을 가정한다.
|
|
196
|
+
연결 확인은 대상을 순차로 확인하며 요청마다 `--request-timeout`(기본 30초) 상한이 적용된다.
|
|
197
|
+
`logncrash` 확인은 최근 1분 범위의 검색 요청을 하나 보내므로 Log & Crash 조회 토큰을 쓴다.
|
|
198
|
+
|
|
199
|
+
`skills.agents.claude`와 `skills.agents.codex`는 각각 Claude Code(`~/.claude/skills/nhncloud-cli`)와 Codex(`~/.agents/skills/nhncloud-cli`) 경로 하나의 `SkillStatus`(`schemaVersion` 1)에 `recoveryCommand`(복구 명령, `current`이면 `null`)를 더한 것이다.
|
|
200
|
+
상태를 판정하지 못하면 `{ "status": "error", "reason": string }`이다.
|
|
201
|
+
한 경로의 판정이 실패해도 그 에이전트만 `error`가 되고 다른 에이전트의 상태는 그대로다.
|
|
202
|
+
`reason`에는 원문 오류 메시지를 넣지 않고 고정 문구만 쓴다. 오류에 문자열 errno 코드(`EACCES` 등)가 있으면 그 코드만 붙인다.
|
|
203
|
+
에이전트가 늘면 `agents`에 키가 추가되며 기존 키의 모양은 바뀌지 않는다.
|
|
204
|
+
doctor 가 경로마다 다른 복구 명령을 보여도 어느 명령이든 두 경로를 함께 고친다.
|
|
205
|
+
|
|
115
206
|
## Profile 우선순위
|
|
116
207
|
|
|
117
208
|
profile 해석 순서:
|
|
@@ -157,6 +248,32 @@ deploy 바이너리 업로드·다운로드의 상한은 최소 600초를 유지
|
|
|
157
248
|
`instance create --timeout` 과 `ncs workload create --timeout` 은 상태 폴링 대기 시간을 지정한다.
|
|
158
249
|
HTTP 요청 상한과는 다른 설정이므로 서로 대체하지 않는다.
|
|
159
250
|
|
|
251
|
+
## 프록시
|
|
252
|
+
|
|
253
|
+
외부로 나가는 길이 프록시뿐인 서버에서는 전역 옵션이나 환경변수로 프록시를 지정한다.
|
|
254
|
+
토큰 발급을 포함한 모든 HTTP 요청이 같은 프록시를 거친다.
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
nhncloud --proxy http://proxy.example:3128 skm confirm --json
|
|
258
|
+
HTTPS_PROXY=http://proxy.example:3128 nhncloud skm confirm --json
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
우선순위는 다음과 같다.
|
|
262
|
+
|
|
263
|
+
1. `--proxy <url>`: HTTP와 HTTPS 요청 모두에 쓴다.
|
|
264
|
+
2. 소문자 환경변수 `https_proxy`, `http_proxy`
|
|
265
|
+
3. 대문자 환경변수 `HTTPS_PROXY`, `HTTP_PROXY`
|
|
266
|
+
|
|
267
|
+
- `HTTPS_PROXY` 가 없으면 HTTPS 요청에도 `HTTP_PROXY` 를 쓴다.
|
|
268
|
+
- `NO_PROXY`(또는 `no_proxy`)에 적은 host 는 프록시를 거치지 않는다. `--proxy` 를 줘도 `NO_PROXY` 는 그대로 적용된다.
|
|
269
|
+
- 빈 값은 지정하지 않은 것으로 본다. 프록시 값이 하나도 없으면 직접 연결한다.
|
|
270
|
+
- 값은 `http://` 또는 `https://` 로 시작하는 URL 이어야 한다. 아니면 API 호출 전에 종료 코드 3으로 실패하고, 오류 문구에는 값 대신 옵션이나 환경변수 이름만 나온다.
|
|
271
|
+
이 검사는 모든 명령 앞에서 하므로 `skills`, `commands`, `configure`, `doctor` 처럼 HTTP 요청이 없는 명령도 종료 코드 3으로 끝난다.
|
|
272
|
+
- 프록시에 연결하지 못하면 종료 코드 1로 실패하고, 오류 문구 뒤 괄호에 원인이 붙는다(예: `fetch failed (connect ECONNREFUSED ...)`).
|
|
273
|
+
|
|
274
|
+
프록시 인증이 필요하면 `http://user:password@proxy.example:3128` 형식으로 사용자 정보를 URL 에 넣는다.
|
|
275
|
+
비밀번호가 셸 이력에 남지 않도록 `--proxy` 대신 환경변수로 넘긴다.
|
|
276
|
+
|
|
160
277
|
## Command catalog
|
|
161
278
|
|
|
162
279
|
`nhncloud commands`는 command path, argument, option, description을 출력한다. 외부 API를 호출하지 않는다.
|
|
@@ -173,7 +290,7 @@ nhncloud commands --json | jq '.commands[] | select(.path=="nks cluster list")'
|
|
|
173
290
|
|
|
174
291
|
| 확인 방식 | 명령 |
|
|
175
292
|
|---|---|
|
|
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` |
|
|
293
|
+
| 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`, `skm secret patch` (`--yes` 없으면 미리보기) |
|
|
177
294
|
| 비대화형 환경에서는 `--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` |
|
|
178
295
|
| 확인 질문과 `--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`) |
|
|
179
296
|
|
|
@@ -31,6 +31,7 @@ nhncloud skm keystore list
|
|
|
31
31
|
nhncloud skm key list <keystore-id>
|
|
32
32
|
nhncloud skm key list <keystore-id> --status active # active|inactive 로 거른다
|
|
33
33
|
nhncloud skm secret get <key-id> --quiet
|
|
34
|
+
nhncloud skm secret get <key-id> --field <name> --quiet
|
|
34
35
|
```
|
|
35
36
|
|
|
36
37
|
`--quiet`가 출력하는 값은 다음과 같다.
|
|
@@ -38,6 +39,7 @@ nhncloud skm secret get <key-id> --quiet
|
|
|
38
39
|
- `keystore list`·`keystore get`: `keyStoreId`
|
|
39
40
|
- `key list`·`key get`: `keyId`
|
|
40
41
|
- `secret get`: 기밀 데이터
|
|
42
|
+
- `secret get --field`: 필드 값(문자열이면 원문, 그 밖은 JSON 표기)
|
|
41
43
|
- `symmetric-key get`: 대칭키 원문
|
|
42
44
|
- `symmetric-key encrypt`: 암호문
|
|
43
45
|
- `symmetric-key decrypt`: 평문
|
|
@@ -46,6 +48,7 @@ nhncloud skm secret get <key-id> --quiet
|
|
|
46
48
|
- `symmetric-key create-local-key`: 평문 키와 암호화된 키 두 줄
|
|
47
49
|
- `asymmetric-key verify`: 출력 없음
|
|
48
50
|
- `key create`·`secret update`·`key delete|purge`: `keyId`
|
|
51
|
+
- `secret patch`: `action`(`added`, `replaced`, `deleted`, `unchanged`)
|
|
49
52
|
- `keystore create|update|delete`: `keyStoreId`
|
|
50
53
|
- `keystore auth add|delete|purge`: 입력한 IPv4·MAC 값(소문자로 정규화) 또는 인증서 이름
|
|
51
54
|
- `keystore auth get`: 조회한 인증 정보의 값 또는 인증서 이름
|
|
@@ -70,6 +73,26 @@ printf '%s' "$SECRET" | nhncloud skm key create <keystore-id> --type secret --na
|
|
|
70
73
|
- 대칭키·비대칭키는 자동 회전 없이 만들어진다. 자동 회전은 콘솔에서 설정한다.
|
|
71
74
|
- MAC 값은 소문자로 바꿔 보내므로 콘솔에서 대문자로 등록한 MAC은 CLI로 지우지 못할 수 있다.
|
|
72
75
|
|
|
76
|
+
값이 JSON 객체인 기밀 데이터는 `secret patch`로 최상위 필드 하나만 더하거나 바꾸거나 지운다.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
printf '%s' "$NEW_PASSWORD" | nhncloud skm secret patch <key-id> db_password --replace # 미리보기
|
|
80
|
+
printf '%s' "$NEW_PASSWORD" | nhncloud skm secret patch <key-id> db_password --replace --yes # 반영
|
|
81
|
+
nhncloud skm secret patch <key-id> old_field --delete --yes
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- 값이 JSON 객체인 기밀 데이터에만 쓴다. 값이 JSON 객체가 아니거나, 다시 쓰면 바뀌는 숫자(안전 정수 범위 밖의 정수, 유효 숫자 15자리를 넘는 소수)가 있으면 종료 코드 3이다.
|
|
85
|
+
- 새 값은 `--file`이나 표준 입력으로만 받고 JSON 문자열로 들어간다. 끝 줄바꿈도 값에 들어가므로 `echo` 대신 `printf '%s'`로 넘긴다.
|
|
86
|
+
- 기본은 미리보기라 동작(`action`)만 출력하고 쓰지 않는다. `--yes`를 줄 때만 전체 값을 쓴다. 동작이 `unchanged`면 `--yes`를 줘도 쓰지 않는다.
|
|
87
|
+
- 이미 있는 필드의 값을 다른 값으로 바꾸려면 `--replace`가 필요하다. 없으면 미리보기에서도 종료 코드 3이다. `--delete`는 `--file`·`--replace`와 함께 쓸 수 없고, 지울 필드가 없으면 `unchanged`다.
|
|
88
|
+
- 반영 뒤 같은 키를 다시 조회해 바꾼 필드와 다른 필드를 대조하고, 결과를 `fieldVerified`, `othersVerified`로 낸다. 어긋나거나 다시 조회하지 못하면 결과를 출력한 뒤 종료 코드 1로 끝난다.
|
|
89
|
+
- 실패 문구에 따라 할 일이 다르다.
|
|
90
|
+
- 쓰기 요청 실패: 반영 여부를 알 수 없다. 같은 명령을 `--yes` 없이 다시 실행해 `action`이 `unchanged`인지 확인한다.
|
|
91
|
+
- 다시 조회 실패: 값은 바꿨지만 검증하지 못했다. `secret get`으로 현재 값을 확인한다.
|
|
92
|
+
- 대조 불일치: 다른 쓰기가 끼어들었거나 승인 기능 때문에 변경이 대기 중일 수 있다. `secret get`으로 현재 값을 확인한다.
|
|
93
|
+
- 기밀 데이터에는 버전이 없다. 같은 키를 동시에 고치면 나중에 쓴 쪽이 앞의 변경을 덮어쓰고, 덮어쓴 값은 되돌릴 수 없다.
|
|
94
|
+
- 같은 이름의 키가 둘 이상이면 뒤의 것만 남는다. 들여쓰기와 끝 줄바꿈은 원래 값을 따르고, 그 밖의 공백, 이스케이프, 숫자 표기(`1.0` 은 `1`)는 다시 쓴다. 필드 순서는 유지하고 새 필드는 끝에 붙는다.
|
|
95
|
+
|
|
73
96
|
## 입력과 크기 한도
|
|
74
97
|
|
|
75
98
|
암복호화·서명·검증 명령의 입력은 `--plaintext`·`--ciphertext`, `--file`, 표준 입력 순서로 고른다.
|
|
@@ -81,7 +104,9 @@ printf '%s' "$SECRET" | nhncloud skm key create <keystore-id> --type secret --na
|
|
|
81
104
|
- `symmetric-key decrypt`: 암호문 1MB(1,000,000바이트)
|
|
82
105
|
- `asymmetric-key sign`·`verify`: 245바이트, `--standard`를 주면 64KB(65536바이트)
|
|
83
106
|
- `key create --type secret`·`secret update`: 기밀 데이터 값 1MB(1,000,000바이트)
|
|
107
|
+
- `secret patch`: 필드에 넣을 값 1MB(1,000,000바이트)
|
|
84
108
|
- 인증서 비밀번호: 1024바이트
|
|
109
|
+
- 기밀 데이터는 공식 문서 기준 32KB 이하 텍스트이며, 이 상한은 서버가 판정한다.
|
|
85
110
|
- `--standard`는 바이너리 입력을 base64로 바꿔 보낸다.
|
|
86
111
|
|
|
87
112
|
```bash
|
|
@@ -98,8 +123,15 @@ printf 'hello' | nhncloud skm symmetric-key encrypt <key-id> --quiet
|
|
|
98
123
|
```bash
|
|
99
124
|
nhncloud skm secret get <key-id> --json | jq -j '.secret' > secret.txt
|
|
100
125
|
```
|
|
126
|
+
|
|
127
|
+
`secret get --field <name>`은 값이 JSON 객체인 기밀 데이터에서 최상위 필드 하나만 낸다.
|
|
128
|
+
`--json` 출력은 `{ keyId, field, value }`이고 `value`는 필드의 원래 JSON 타입이다.
|
|
129
|
+
필드가 없거나 값이 JSON 객체가 아니면 종료 코드 3이다.
|
|
130
|
+
문자열이 아닌 필드의 숫자가 정밀도를 잃을 수 있으면(안전 정수 범위를 넘거나 유효 숫자 15자리를 넘으면) 이때도 종료 코드 3이다.
|
|
131
|
+
|
|
101
132
|
인증서 인증 상세의 `password`는 `***`로 가린다.
|
|
102
133
|
`secret update`는 바꾼 값을 출력하지 않는다.
|
|
134
|
+
`secret patch`는 값과 해시를 출력하지 않는다. 출력은 `keyId`, `field`, `action`, `applied`, `fieldVerified`, `othersVerified`뿐이다.
|
|
103
135
|
`symmetric-key get`은 대칭키 원문을 stdout에 낸다.
|
|
104
136
|
`key get`, `keystore get`, `keystore auth get`은 메타데이터만 출력하고 키 원문과 인증서 비밀번호는 내지 않는다.
|
|
105
137
|
비밀값 명령의 stdout을 로그나 이슈, 채팅에 붙이지 않는다.
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
5. exit code를 확인한다.
|
|
12
12
|
6. 서비스별 인증 모델을 대조한다.
|
|
13
13
|
|
|
14
|
-
`nhncloud doctor`는
|
|
14
|
+
`nhncloud doctor`는 기본으로 외부 API를 호출하지 않고 자격증명, 설정 파일, 공개 스킬 설치 상태를 진단한다.
|
|
15
|
+
`--check-connection`을 주면 대상 profile 의 자격증명으로 실제 연결까지 확인한다.
|
|
16
|
+
출력 필드와 상태 값은 [common.md](common.md#설정-진단)의 「설정 진단」 절을 본다.
|
|
15
17
|
|
|
16
18
|
## 인증 모델
|
|
17
19
|
|