create-dwy 0.5.1 → 0.6.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/bin/index.js +1 -1
- package/package.json +2 -2
- package/src/create.js +61 -37
- package/src/sync.js +212 -61
- package/templates/claude-global/CLAUDE.md +92 -0
- package/templates/claude-global/rules/dwy-android-core.md +610 -0
- package/templates/claude-global/rules/dwy-api-design.md +110 -0
- package/templates/claude-global/rules/dwy-db-migration.md +46 -0
- package/templates/claude-global/rules/dwy-flutter-core.md +564 -0
- package/templates/claude-global/rules/dwy-flutter-network.md +222 -0
- package/templates/claude-global/rules/dwy-flutter-router.md +97 -0
- package/templates/claude-global/rules/dwy-flutter-testing.md +94 -0
- package/templates/claude-global/rules/dwy-git-commit-convention.md +82 -0
- package/templates/claude-global/rules/dwy-git-security.md +53 -0
- package/templates/claude-global/rules/dwy-payload-limits.md +178 -0
- package/templates/claude-global/rules/{prefer-open-source.md → dwy-prefer-open-source.md} +4 -0
- package/templates/claude-global/rules/dwy-project-structure.md +181 -0
- package/templates/claude-global/rules/{python-code-style.md → dwy-python-core.md} +292 -358
- package/templates/claude-global/rules/dwy-python-fastapi.md +272 -0
- package/templates/claude-global/rules/dwy-python-orm.md +61 -0
- package/templates/claude-global/rules/{backend-security.md → dwy-python-security.md} +99 -72
- package/templates/claude-global/rules/dwy-python-testing.md +53 -0
- package/templates/claude-global/rules/{server-security.md → dwy-server-security.md} +1 -2
- package/templates/claude-global/rules/dwy-tdd-development.md +70 -0
- package/templates/claude-global/rules/dwy-tech-stack.md +60 -0
- package/templates/claude-global/rules/dwy-vue-api.md +146 -0
- package/templates/claude-global/rules/{vue-code-style.md → dwy-vue-core.md} +338 -152
- package/templates/claude-global/rules/dwy-vue-pinia.md +75 -0
- package/templates/claude-global/rules/dwy-vue-testing.md +102 -0
- package/templates/claude-global/skills/dwy-deploy-audit/SKILL.md +481 -0
- package/templates/claude-global/skills/dwy-deploy-audit/references/checks-data.md +117 -0
- package/templates/claude-global/skills/dwy-deploy-audit/references/checks-network.md +74 -0
- package/templates/claude-global/skills/dwy-deploy-audit/references/checks-runtime.md +184 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_base.sh +39 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_capacity.sh +278 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_db.sh +122 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_docker.sh +249 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_env.sh +64 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_https.sh +60 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_logs.sh +209 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_nginx.sh +92 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_resilience.sh +157 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_secrets.sh +327 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_services.sh +77 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/check_ssh.sh +56 -0
- package/templates/claude-global/skills/dwy-deploy-audit/scripts/run_all.sh +105 -0
- package/templates/claude-global/skills/dwy-docker/SKILL.md +187 -0
- package/templates/claude-global/skills/dwy-docker/references/ask-templates.md +142 -0
- package/templates/claude-global/skills/dwy-docker/references/templates.md +479 -0
- package/templates/claude-global/skills/dwy-docker/references/version-rules.md +76 -0
- package/templates/claude-global/skills/dwy-docker/scripts/query_dockerhub.py +204 -0
- package/templates/claude-global/skills/dwy-docker/scripts/scan_images.sh +185 -0
- package/templates/claude-global/skills/dwy-eapi/SKILL.md +433 -0
- package/templates/claude-global/skills/dwy-eapi/references/tasks-integration-guide.md +387 -0
- package/templates/claude-global/skills/dwy-ekit/SKILL.md +85 -0
- package/templates/claude-global/skills/dwy-ekit/references/data.md +135 -0
- package/templates/claude-global/skills/dwy-ekit/references/form.md +68 -0
- package/templates/claude-global/skills/dwy-ekit/references/request.md +183 -0
- package/templates/claude-global/skills/dwy-ekit/references/ui.md +109 -0
- package/templates/claude-global/skills/{dwy-frontend-eui → dwy-eui}/SKILL.md +129 -15
- package/templates/claude-global/skills/dwy-eui/references/eui-design-guide.md +257 -0
- package/templates/claude-global/skills/dwy-eui/references/eui-integration-guide.md +302 -0
- package/templates/claude-global/skills/dwy-eui/references/eui-landing-design-guide.md +437 -0
- package/templates/claude-global/skills/dwy-fullstack-scaffold/SKILL.md +214 -0
- package/templates/claude-global/skills/dwy-mirror-source/SKILL.md +275 -0
- package/templates/claude-global/skills/dwy-mirror-source/references/dockerfile-snippets.md +228 -0
- package/templates/claude-global/skills/dwy-mirror-source/references/mirror-providers.md +150 -0
- package/templates/claude-global/skills/dwy-mirror-source/scripts/__pycache__/check_mirrors.cpython-313.pyc +0 -0
- package/templates/claude-global/skills/dwy-mirror-source/scripts/apply_mirrors.py +666 -0
- package/templates/claude-global/skills/dwy-mirror-source/scripts/check_mirrors.py +868 -0
- package/templates/claude-global/skills/dwy-pentest/SKILL.md +344 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/__init__.py +1 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/__pycache__/__init__.cpython-311.pyc +0 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/__pycache__/config.cpython-311.pyc +0 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/__pycache__/executor.cpython-311.pyc +0 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/__pycache__/severity.cpython-311.pyc +0 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/__pycache__/validator.cpython-311.pyc +0 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/config.py +109 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/executor.py +157 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/severity.py +96 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/lib/validator.py +113 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_auth.py +289 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_recon.py +217 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_report.py +343 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_scan.py +205 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_ssl.py +208 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_vuln.py +205 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pentest_web.py +330 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/pyproject.toml +14 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/setup_tools.sh +97 -0
- package/templates/claude-global/skills/dwy-pentest/scripts/uv.lock +415 -0
- package/templates/claude-global/skills/{dwy-release → dwy-publish}/SKILL.md +42 -18
- package/templates/claude-global/skills/dwy-vue-core/SKILL.md +890 -0
- package/templates/project/backend/.dwy.hbs +5 -0
- package/templates/project/backend/.python-version +1 -0
- package/templates/project/backend/CLAUDE.md.hbs +40 -0
- package/templates/project/{web/backend → backend}/alembic/script.py.mako +2 -0
- package/templates/project/{web/backend → backend}/alembic.ini.hbs +0 -1
- package/templates/project/backend/deploy.sh.hbs +18 -0
- package/templates/project/{web → backend}/docker-compose.prod.yml.hbs +1 -1
- package/templates/project/{web/backend → backend}/pyproject.toml.hbs +4 -5
- package/templates/project/{web/backend → backend}/src/app/config.py.hbs +1 -1
- package/templates/project/backend/src/app/database.py +10 -0
- package/templates/project/backend/src/app/dependencies.py +5 -0
- package/templates/project/{web/backend → backend}/src/app/main.py.hbs +3 -3
- package/templates/project/backend/src/app/models/base.py +5 -0
- package/templates/project/web/CLAUDE.md.hbs +29 -36
- package/templates/project/web/{frontend → apps/web}/index.html.hbs +1 -0
- package/templates/project/web/{frontend → apps/web}/package.json.hbs +4 -3
- package/templates/project/web/apps/web/src/App.vue +9 -0
- package/templates/project/web/apps/web/src/api/client.ts +5 -0
- package/templates/project/web/apps/web/src/composables/.gitkeep +0 -0
- package/templates/project/web/apps/web/src/layouts/DefaultLayout.vue +8 -0
- package/templates/project/web/{frontend → apps/web}/src/router/index.ts +1 -1
- package/templates/project/web/{frontend → apps/web}/src/stores/auth.ts +4 -2
- package/templates/project/web/apps/web/src/style.css +2 -0
- package/templates/project/web/apps/web/src/types/router.d.ts +8 -0
- package/templates/project/web/apps/web/src/views/HomeView.vue +8 -0
- package/templates/project/web/apps/web/tsconfig.app.json +18 -0
- package/templates/project/web/apps/web/tsconfig.json +6 -0
- package/templates/project/web/{frontend → apps/web}/vite.config.ts.hbs +7 -1
- package/templates/project/web/package.json.hbs +16 -0
- package/templates/project/web/packages/.gitkeep +0 -0
- package/templates/project/web/pnpm-workspace.yaml +3 -0
- package/templates/claude-global/hooks/post-sync-claude-global.sh +0 -72
- package/templates/claude-global/rules/agent-team-execution.md +0 -138
- package/templates/claude-global/rules/agent-team-patterns.md +0 -157
- package/templates/claude-global/rules/git-commit-convention.md +0 -106
- package/templates/claude-global/rules/git-security.md +0 -144
- package/templates/claude-global/skills/dwy-backend-base/SKILL.md +0 -279
- package/templates/claude-global/skills/dwy-frontend-core/SKILL.md +0 -181
- package/templates/project/web/.claude/commands/deploy.md +0 -4
- package/templates/project/web/backend/src/app/models/base.py +0 -5
- package/templates/project/web/deploy.sh.hbs +0 -113
- package/templates/project/web/frontend/src/App.vue +0 -3
- package/templates/project/web/frontend/src/api/client.ts +0 -13
- package/templates/project/web/frontend/src/style.css +0 -1
- package/templates/project/web/frontend/src/views/HomeView.vue +0 -5
- package/templates/project/web/frontend/tsconfig.app.json +0 -14
- package/templates/project/web/frontend/tsconfig.json +0 -4
- /package/templates/{project/web/backend → claude-global/skills/dwy-pentest/scripts}/.python-version +0 -0
- /package/templates/project/{web/backend → backend}/Dockerfile +0 -0
- /package/templates/project/{web/backend → backend}/alembic/env.py.hbs +0 -0
- /package/templates/{claude-global/skills → project/backend/alembic/versions}/.gitkeep +0 -0
- /package/templates/project/{web → backend}/docker-compose.dev.yml.hbs +0 -0
- /package/templates/project/{web/backend → backend}/src/app/__init__.py +0 -0
- /package/templates/project/{web/backend → backend}/src/app/models/__init__.py +0 -0
- /package/templates/project/{web/backend → backend}/src/app/routers/__init__.py +0 -0
- /package/templates/project/{web/backend → backend}/src/app/routers/health.py +0 -0
- /package/templates/project/{web/backend → backend}/src/app/schemas/__init__.py +0 -0
- /package/templates/project/{web/backend → backend}/src/app/services/__init__.py +0 -0
- /package/templates/project/{web/backend → backend}/tests/__init__.py +0 -0
- /package/templates/project/{web/backend → backend}/tests/conftest.py.hbs +0 -0
- /package/templates/project/{web/backend/alembic/versions → mobile}/.gitkeep +0 -0
- /package/templates/project/web/{frontend → apps/web}/src/components/.gitkeep +0 -0
- /package/templates/project/web/{frontend → apps/web}/src/main.ts +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Pinia Setup Store 状态管理规范
|
|
3
|
+
paths:
|
|
4
|
+
- "**/stores/**/*.ts"
|
|
5
|
+
- "**/store/**/*.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Pinia 状态管理规范
|
|
9
|
+
|
|
10
|
+
## 四、Pinia 状态管理
|
|
11
|
+
|
|
12
|
+
### 强制使用 Setup Store
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// ✅ Setup Store(强制)
|
|
16
|
+
export const useAuthStore = defineStore('auth', () => {
|
|
17
|
+
const token = ref<string | null>(localStorage.getItem('token'))
|
|
18
|
+
const user = ref<UserInfo | null>(null)
|
|
19
|
+
|
|
20
|
+
const isLoggedIn = computed(() => !!token.value)
|
|
21
|
+
|
|
22
|
+
async function login(username: string, password: string) {
|
|
23
|
+
const res = await apiLogin(username, password)
|
|
24
|
+
token.value = res.data.access_token
|
|
25
|
+
localStorage.setItem('token', token.value)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function logout() {
|
|
29
|
+
token.value = null
|
|
30
|
+
user.value = null
|
|
31
|
+
localStorage.removeItem('token')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return { token, user, isLoggedIn, login, logout }
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// ❌ Options Store(禁止)
|
|
38
|
+
export const useAuthStore = defineStore('auth', {
|
|
39
|
+
state: () => ({ token: '' }),
|
|
40
|
+
actions: { login() {} }
|
|
41
|
+
})
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Store 设计原则
|
|
45
|
+
|
|
46
|
+
| 原则 | 说明 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| 单一职责 | 一个 store 管理一个业务域(auth、menu、user) |
|
|
49
|
+
| 不直接修改 state | 通过方法修改,不在组件中直接 `store.xxx = yyy` |
|
|
50
|
+
| 异步操作放 store | API 调用封装在 store 方法中 |
|
|
51
|
+
| 解构用 `storeToRefs` | 解构响应式状态必须用 `storeToRefs`,方法直接解构 |
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// ✅ 正确解构
|
|
55
|
+
const store = useReportStore()
|
|
56
|
+
const { report, loading } = storeToRefs(store)
|
|
57
|
+
const { setReport, reset } = store
|
|
58
|
+
|
|
59
|
+
// ❌ 错误解构(丢失响应性)
|
|
60
|
+
const { report, loading } = store
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 状态管理规范(跨端共识)
|
|
66
|
+
|
|
67
|
+
| 平台 | 方案 | 详细规范 |
|
|
68
|
+
|------|------|---------|
|
|
69
|
+
| Vue | Pinia Setup Store | 见 `dwy-vue-pinia.md`(本文件) |
|
|
70
|
+
| Flutter | Riverpod | 见 `flutter-code-style.md` 状态管理章节 |
|
|
71
|
+
|
|
72
|
+
**跨端共识:**
|
|
73
|
+
- 认证状态全局管理(Vue: `useAuthStore`,Flutter: `authProvider`)
|
|
74
|
+
- 页面级状态就近管理,不上提到全局
|
|
75
|
+
- 缓存策略:列表数据按需刷新,不做客户端持久化缓存(除离线场景)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Vitest 单元测试规范
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*.test.ts"
|
|
5
|
+
- "**/*.spec.ts"
|
|
6
|
+
- "**/tests/**/*.ts"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Vitest 单元测试规范
|
|
10
|
+
|
|
11
|
+
## 十三、测试规范(Vitest)
|
|
12
|
+
|
|
13
|
+
### 强制规则
|
|
14
|
+
- 使用 **Vitest** 作为测试框架,配合 **@vue/test-utils** + **happy-dom**
|
|
15
|
+
- 测试文件**必须放在项目根目录的 `tests/` 目录**,按模块镜像 `src/` 结构,**禁止**放在 `src/` 内
|
|
16
|
+
- `tsconfig.app.json` 的 `include` **只包含 `src/`**,确保打包不携带测试文件
|
|
17
|
+
- 测试文件命名:`*.test.ts`
|
|
18
|
+
|
|
19
|
+
### 依赖安装
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm add -D vitest @vue/test-utils happy-dom
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### package.json 脚本
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"scripts": {
|
|
30
|
+
"test": "vitest",
|
|
31
|
+
"test:run": "vitest run"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### vitest.config.ts(独立文件,不写在 vite.config.ts 中)
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { fileURLToPath } from 'node:url'
|
|
40
|
+
import { defineConfig } from 'vitest/config'
|
|
41
|
+
import vue from '@vitejs/plugin-vue'
|
|
42
|
+
|
|
43
|
+
export default defineConfig({
|
|
44
|
+
plugins: [vue()],
|
|
45
|
+
resolve: {
|
|
46
|
+
alias: {
|
|
47
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
test: {
|
|
51
|
+
environment: 'happy-dom',
|
|
52
|
+
include: ['tests/**/*.test.ts'],
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 目录结构与导入
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
tests/
|
|
61
|
+
├── utils/format.test.ts # 测试 src/utils/format.ts
|
|
62
|
+
├── stores/auth.test.ts # 测试 src/stores/auth.ts
|
|
63
|
+
├── api/client.test.ts # 测试 src/api/client.ts
|
|
64
|
+
└── router/index.test.ts # 测试 src/router/index.ts
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
测试文件中通过 `@` 别名导入源码,**禁止**使用相对路径回溯到 `src/`:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// ✅ 使用 @ 别名
|
|
71
|
+
import { formatBytes } from '@/utils/format'
|
|
72
|
+
import { useAuthStore } from '@/stores/auth'
|
|
73
|
+
|
|
74
|
+
// ❌ 禁止相对路径回溯
|
|
75
|
+
import { formatBytes } from '../../src/utils/format'
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 打包隔离
|
|
79
|
+
|
|
80
|
+
`tsconfig.app.json` 的 `include` 只包含 `src/`,确保 `tests/` 不会被 `vue-tsc` 编译和打包:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**禁止**在 `tsconfig.app.json` 中 include `tests/`。
|
|
89
|
+
|
|
90
|
+
### 禁止的写法
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
# ❌ 测试文件放在 src/ 内
|
|
94
|
+
src/utils/format.test.ts
|
|
95
|
+
src/stores/__tests__/auth.test.ts
|
|
96
|
+
src/components/Button.test.ts
|
|
97
|
+
|
|
98
|
+
# ✅ 测试文件放在独立 tests/ 目录
|
|
99
|
+
tests/utils/format.test.ts
|
|
100
|
+
tests/stores/auth.test.ts
|
|
101
|
+
tests/components/Button.test.ts
|
|
102
|
+
```
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dwy-deploy-audit
|
|
3
|
+
description: "部署后线上环境基础安全巡检:远程 SSH 到目标服务器,逐项核对 SSH/Nginx/数据库/HTTPS/Docker/环境变量等基础环境配置,输出分级安全报告,只报告不修复。触发条件:用户说'部署巡检'、'上线检查'、'基础环境检查'、'部署审计'、'线上安全检查'、'生产环境审计' 时。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 部署后基础环境巡检 (deploy-audit)
|
|
7
|
+
|
|
8
|
+
对**已部署上线**的服务器执行只读式安全合规审计,逐项核对基础环境配置,输出分级报告。
|
|
9
|
+
|
|
10
|
+
**与 dwy-pentest 的区别:**
|
|
11
|
+
|
|
12
|
+
| 维度 | dwy-pentest | dwy-deploy-audit (本 skill) |
|
|
13
|
+
|------|-------------|------------------------------|
|
|
14
|
+
| 视角 | 攻击者(黑盒) | 运维者(白盒) |
|
|
15
|
+
| 行为 | 主动扫描、漏洞利用尝试 | 只读配置文件、状态检查 |
|
|
16
|
+
| 范围 | 全栈漏洞 + Web 测试 + 暴力破解 | 基础环境配置合规 |
|
|
17
|
+
| 副作用 | 可能触发 IDS、产生大量请求 | 仅 SSH 登录读取配置,零侵入 |
|
|
18
|
+
| 输出 | 漏洞清单 + 复现步骤 | 配置不合规清单 + 修复建议 |
|
|
19
|
+
|
|
20
|
+
**脚本目录:** `~/.claude/skills/dwy-deploy-audit/scripts/`(以下简称 `{scripts}`)
|
|
21
|
+
|
|
22
|
+
**详细检查规则索引:**
|
|
23
|
+
|
|
24
|
+
| 文件 | 何时读 | 覆盖 |
|
|
25
|
+
|------|--------|------|
|
|
26
|
+
| `references/checks-network.md` | 即将运行 4.1 / 4.2 / 4.4 / 4.7 类检查或解读其输出时 | SSH / Nginx / HTTPS / 依赖服务连通性 |
|
|
27
|
+
| `references/checks-data.md` | 即将运行 4.3 / 4.5 / 4.11 类检查或解读其输出时 | 数据库暴露 / 环境变量 / 凭证强度 |
|
|
28
|
+
| `references/checks-runtime.md` | 即将运行 4.6 / 4.8 / 4.9 / 4.10 类检查或解读其输出时 | Docker / 自愈 / 日志防爆 / 资源推荐 |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 强制原则
|
|
33
|
+
|
|
34
|
+
1. **只读不写** — 所有检查只读取配置和状态,**禁止**执行任何修改命令(`sed -i`、`systemctl restart`、`iptables -A` 等)
|
|
35
|
+
2. **远程 SSH 执行** — 不在本地猜测,所有结论必须基于目标服务器的真实配置
|
|
36
|
+
3. **明确目标** — 用户必须显式提供 SSH 连接信息(host、user、端口、key),未提供则停止并询问
|
|
37
|
+
4. **不修复** — 发现问题只输出报告 + 修复建议,**禁止**自动修复或建议用户立即执行修复命令
|
|
38
|
+
5. **分级输出** — 所有问题必须按 critical / high / medium / low / info 五级分类
|
|
39
|
+
6. **生产环境敏感** — 任何检查命令需明确标注是否涉及生产数据,避免 `pg_dump`、`tcpdump` 等高负载操作
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 流程总览
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
1. 收集目标信息 → 确认 SSH 连接、目标服务范围
|
|
47
|
+
2. 连通性测试 → SSH 登录、sudo 权限确认
|
|
48
|
+
3. 基础环境识别 → 系统版本、已部署服务清单
|
|
49
|
+
4. 分类检查 → SSH / Nginx / DB / HTTPS / Env / Docker / Services / Resilience / Logs / Capacity / Secrets(主 Bash 调用 run_all.sh,12 路并行)
|
|
50
|
+
5. 生成报告 → 按等级聚合,Markdown 格式
|
|
51
|
+
6. 修复建议 → 每条问题给出修复方向(不执行)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**共 6 步,按顺序执行。**
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Step 1: 收集目标信息
|
|
59
|
+
|
|
60
|
+
向用户确认以下参数,**任一缺失则停止并询问**:
|
|
61
|
+
|
|
62
|
+
| 参数 | 必填 | 说明 |
|
|
63
|
+
|------|------|------|
|
|
64
|
+
| `host` | 是 | 服务器 IP 或域名 |
|
|
65
|
+
| `user` | 是 | SSH 登录用户(优先非 root) |
|
|
66
|
+
| `port` | 否 | SSH 端口,默认 22 |
|
|
67
|
+
| `key` | 是 | SSH 私钥路径 或 用户已配置 ssh config |
|
|
68
|
+
| `sudo` | 否 | 是否有 sudo 权限(影响检查覆盖率) |
|
|
69
|
+
| `services` | 否 | 已知的部署服务清单(nginx / postgres / redis / docker 等),不填则自动探测 |
|
|
70
|
+
|
|
71
|
+
**示例对话:**
|
|
72
|
+
```
|
|
73
|
+
用户: 帮我审计一下我的服务器
|
|
74
|
+
助手: 请提供以下信息:
|
|
75
|
+
1. 服务器地址(IP 或域名):
|
|
76
|
+
2. SSH 用户名:
|
|
77
|
+
3. SSH 端口(默认 22):
|
|
78
|
+
4. SSH 私钥路径(如 ~/.ssh/id_ed25519):
|
|
79
|
+
5. 该用户是否有 sudo 权限(影响 nginx/sshd 等系统配置的可读性):
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Step 2: 连通性测试
|
|
85
|
+
|
|
86
|
+
执行最小连通性测试,确认 SSH 可用:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
ssh -o ConnectTimeout=5 -o BatchMode=yes -p ${PORT} -i ${KEY} ${USER}@${HOST} "uname -a && id"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- 失败 → 报告"无法 SSH 连接",列出常见原因(key 错误 / 端口防火墙 / 用户不存在),停止
|
|
93
|
+
- 成功 → 记录 `uname` 输出和当前用户 id,进入 Step 3
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Step 3: 基础环境识别
|
|
98
|
+
|
|
99
|
+
**自动探测目标服务器上已部署的关键服务**,决定后续检查覆盖范围:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
ssh ${TARGET} "
|
|
103
|
+
echo '=== OS ==='
|
|
104
|
+
cat /etc/os-release | grep -E '^(NAME|VERSION)='
|
|
105
|
+
echo '=== Listening Ports ==='
|
|
106
|
+
ss -tlnp 2>/dev/null || netstat -tlnp 2>/dev/null
|
|
107
|
+
echo '=== Running Services ==='
|
|
108
|
+
systemctl list-units --type=service --state=running --no-pager 2>/dev/null | head -30
|
|
109
|
+
echo '=== Docker ==='
|
|
110
|
+
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}' 2>/dev/null || echo 'docker not installed'
|
|
111
|
+
"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
根据探测结果跳过不存在的服务检查(例如未部署 Redis 则跳过 check_db.sh 的 Redis 部分)。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Step 4: 分类检查(并行执行)
|
|
119
|
+
|
|
120
|
+
**主 Claude 直接用 Bash 调用 `run_all.sh`,12 路并行跑完全部检查类目**,把原始输出落到 `/tmp/dwy_audit_<host>.txt`,再由主 Claude `Read` 文件后做分析。
|
|
121
|
+
|
|
122
|
+
### 为什么不用 subagent 派遣
|
|
123
|
+
|
|
124
|
+
实测踩坑后的结论(请勿绕过本节直接派 subagent):
|
|
125
|
+
|
|
126
|
+
1. **subagent 读不到主用户的 `~/.ssh/config`** — 隔离环境下 alias 方式(如 `ssh tencent`)解析失败,报 `Could not resolve hostname :`(host 字段为空)。
|
|
127
|
+
2. **`cat script.sh | ssh host "bash -s"` 调用方式是错的** — 本目录每个 `check_*.sh` **本身就是 wrapper,脚本内部已 ssh**,接收 `<target> [ssh_opts...]` 作为参数。被外层 ssh 再包一层会嵌套两次 ssh,失败。
|
|
128
|
+
3. **subagent 多包一层反而引入协议偏差** — 主 Claude 直接 Bash 既快又能精确控制错误处理。
|
|
129
|
+
|
|
130
|
+
### 调用方式(强制)
|
|
131
|
+
|
|
132
|
+
**主流程:一键并行 + 落盘**
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# 用户提供了 ssh alias(推荐,SSH config 已配好)
|
|
136
|
+
bash {scripts}/run_all.sh <ssh_alias> > /tmp/dwy_audit_<tag>.txt 2>&1
|
|
137
|
+
|
|
138
|
+
# 用户提供显式参数
|
|
139
|
+
bash {scripts}/run_all.sh <user>@<host> -p <port> -i <key> > /tmp/dwy_audit_<tag>.txt 2>&1
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`run_all.sh` 内部已实现 12 路并行(每个 section 独立后台进程,约 15–30s 完成全部 12 类)。完成后所有 section 按固定顺序串接到 stdout。主 Claude 用 `Read` 工具读取该 txt 后做分析。
|
|
143
|
+
|
|
144
|
+
**输出文件命名规则**:`/tmp/dwy_audit_<host_or_alias>.txt`,便于用户回看 + 多次审计互不覆盖。
|
|
145
|
+
|
|
146
|
+
### 脚本调用约定(理解原理用)
|
|
147
|
+
|
|
148
|
+
每个 `check_xxx.sh` 是 wrapper,签名固定为:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
bash {scripts}/check_xxx.sh <target> [ssh_opts...]
|
|
152
|
+
# 例:
|
|
153
|
+
bash {scripts}/check_ssh.sh root@host -p 22 -i ~/.ssh/key
|
|
154
|
+
bash {scripts}/check_ssh.sh tencent # alias 形式(主 Bash 可用)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
脚本内部用 `ssh "${SSH_OPTS[@]}" "${TARGET}" bash -s <<'REMOTE' ... REMOTE` 把检查体 heredoc 给远端执行。**不要再外层管道 / stdin 重定向**。
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# ❌ 错误调用(嵌套 ssh,失败):
|
|
161
|
+
cat {scripts}/check_ssh.sh | ssh root@host "bash -s"
|
|
162
|
+
ssh root@host "bash -s" < {scripts}/check_ssh.sh
|
|
163
|
+
|
|
164
|
+
# ✅ 正确调用:
|
|
165
|
+
bash {scripts}/check_ssh.sh root@host -p 22 -i ~/.ssh/key
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 何时退化为串行
|
|
169
|
+
|
|
170
|
+
目标服务器 `sshd MaxStartups` 限制并发,或网络抖动导致并发失败:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
bash {scripts}/run_all.sh <target> [ssh_opts...] --serial > /tmp/dwy_audit_<tag>.txt 2>&1
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 单类目重跑
|
|
177
|
+
|
|
178
|
+
某一类目失败需重跑时,直接调对应 `check_xxx.sh` 即可:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
bash {scripts}/check_db.sh <target> [ssh_opts...]
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**各类检查内容如下(详细规则见 references/):**
|
|
185
|
+
|
|
186
|
+
### 4.1 SSH 安全 — `{scripts}/check_ssh.sh`
|
|
187
|
+
|
|
188
|
+
检查 SSH 配置是否禁用密码登录、root 直登、是否暴露默认 22 端口,是否启用 fail2ban 等登录防爆机制。
|
|
189
|
+
|
|
190
|
+
→ 详细检查项、期望值、严重级见 `references/checks-network.md` §「4.1 SSH 安全」
|
|
191
|
+
|
|
192
|
+
### 4.2 Nginx 配置 — `{scripts}/check_nginx.sh`
|
|
193
|
+
|
|
194
|
+
检查 Nginx 的 HTTPS 强跳、TLS 协议/密码套件、安全 header、限流(limit_req / limit_conn)、慢速攻击防护与敏感路径暴露。
|
|
195
|
+
|
|
196
|
+
→ 详细检查项、期望值、严重级见 `references/checks-network.md` §「4.2 Nginx 配置」
|
|
197
|
+
|
|
198
|
+
### 4.3 数据库暴露 — `{scripts}/check_db.sh`
|
|
199
|
+
|
|
200
|
+
检查 PostgreSQL / Redis 的监听地址、公网可达性、认证强度、SSL、保护模式与版本 CVE。
|
|
201
|
+
|
|
202
|
+
→ 详细检查项、期望值、严重级见 `references/checks-data.md` §「4.3 数据库暴露」
|
|
203
|
+
|
|
204
|
+
### 4.4 HTTPS 证书 — `{scripts}/check_https.sh`
|
|
205
|
+
|
|
206
|
+
检查证书有效期、域名匹配、证书链完整性、自签证书与 OCSP Stapling。
|
|
207
|
+
|
|
208
|
+
→ 详细检查项、期望值、严重级见 `references/checks-network.md` §「4.4 HTTPS 证书」
|
|
209
|
+
|
|
210
|
+
### 4.5 环境变量 / 文件权限 — `{scripts}/check_env.sh`
|
|
211
|
+
|
|
212
|
+
检查 `.env` 文件权限与位置、nginx 静态目录是否泄漏敏感文件、`/etc/shadow` 权限、应用进程运行用户与 sudo 配置。
|
|
213
|
+
|
|
214
|
+
→ 详细检查项、期望值、严重级见 `references/checks-data.md` §「4.5 环境变量 / 文件权限」
|
|
215
|
+
|
|
216
|
+
### 4.6 Docker 安全 — `{scripts}/check_docker.sh`
|
|
217
|
+
|
|
218
|
+
检查 docker.sock 挂载、容器 root 运行、内部端口公网暴露、镜像 tag 固定度、`--privileged`、daemon 远程 API、RestartPolicy、daemon 日志驱动、registry-mirrors 与境外 registry 使用。
|
|
219
|
+
|
|
220
|
+
→ 详细检查项、期望值、严重级(含跨 skill 联动指引)见 `references/checks-runtime.md` §「4.6 Docker 安全」
|
|
221
|
+
|
|
222
|
+
### 4.7 依赖服务连通性 — `{scripts}/check_services.sh`
|
|
223
|
+
|
|
224
|
+
检查内部服务端口可达性、健康检查端点、跨服务连通、防火墙与外部访问入口。
|
|
225
|
+
|
|
226
|
+
→ 详细检查项、期望值、严重级见 `references/checks-network.md` §「4.7 依赖服务连通性」
|
|
227
|
+
|
|
228
|
+
### 4.8 自愈与资源耗尽防护 — `{scripts}/check_resilience.sh`
|
|
229
|
+
|
|
230
|
+
检查关键服务是否 systemd enable(重启自启)、swap、根分区使用率、logrotate、ulimit、内存压力与容器内存上限。
|
|
231
|
+
|
|
232
|
+
→ 详细检查项、期望值、严重级(B 节系统服务开机自启 + D 节资源耗尽防护)见 `references/checks-runtime.md` §「4.8 自愈与资源耗尽防护」
|
|
233
|
+
|
|
234
|
+
### 4.9 日志大小与防爆检查 — `{scripts}/check_logs.sh`
|
|
235
|
+
|
|
236
|
+
按"日志源"细化到单文件粒度,检查 Docker json-log、Nginx 日志、journal、应用日志,并基于容器存活时长粗估"撑天数"。
|
|
237
|
+
|
|
238
|
+
→ 详细检查项、期望值、严重级与撑天数粗估说明见 `references/checks-runtime.md` §「4.9 日志大小与防爆检查」
|
|
239
|
+
|
|
240
|
+
### 4.10 硬件识别与资源推荐 — `{scripts}/check_capacity.sh`
|
|
241
|
+
|
|
242
|
+
输出宿主硬件规格 + 当前容器 mem_limit + Postgres/Redis 启动参数 + compose 资源声明;主 Claude 对照分级表生成"推荐 vs 当前"对比报告。
|
|
243
|
+
|
|
244
|
+
→ 容器资源推荐分级表、配比原则、对比报告格式、严重等级标记与日志大小推荐分级表见 `references/checks-runtime.md` §「4.10 硬件识别与资源推荐」
|
|
245
|
+
|
|
246
|
+
### 4.11 凭证强度审计 — `{scripts}/check_secrets.sh`
|
|
247
|
+
|
|
248
|
+
读取 7 类凭证源(.env / docker env / Redis requirepass / Postgres POSTGRES_PASSWORD / frps/frpc auth.token / DolphinDB / SSH 私钥),输出强度派生指标 `len / classes / strength / reason`,**强制脱敏不输出明文**。
|
|
249
|
+
|
|
250
|
+
→ 完整检查范围、强度评级算法、SSH 私钥单独评级、脱敏样例、禁止事项与修复指引见 `references/checks-data.md` §「4.11 凭证强度审计」
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Step 5: 生成报告
|
|
255
|
+
|
|
256
|
+
报告必须为 Markdown 格式,**核心是"完整检查清单 + 状态可视化"** — 让用户一眼看到"检查了哪些 / 通过哪些 / 失败哪些 / 跳过哪些 / 未覆盖哪些"。
|
|
257
|
+
|
|
258
|
+
### 状态图标统一
|
|
259
|
+
|
|
260
|
+
| 图标 | 含义 | audit raw 输出触发条件 |
|
|
261
|
+
|------|------|---------------------|
|
|
262
|
+
| ✅ | 通过 | `[OK]` / `[OK+]` |
|
|
263
|
+
| ❌ | 失败 | `[!!!] CRITICAL` / `[!!] HIGH` / `[!] MEDIUM` / `[!] LOW` |
|
|
264
|
+
| ⊘ | 跳过 | `[i] xxx 未安装/未运行/不可读/跳过` |
|
|
265
|
+
| ❓ | 未覆盖 | 本 skill `references/checks-*.md` 4.x 表格里有但 audit 输出没出现该项 |
|
|
266
|
+
|
|
267
|
+
### 主 Claude 生成报告的强制流程
|
|
268
|
+
|
|
269
|
+
1. **拿"清单基准"**:`references/checks-network.md` / `references/checks-data.md` / `references/checks-runtime.md` 各小节里的"**检查项**"列即为完整清单基准(共 ~120 项)
|
|
270
|
+
2. **拿"实际数据"**:用 Read 工具读 `/tmp/dwy_audit_<host>.txt`(run_all.sh 输出)
|
|
271
|
+
3. **逐项配对**:对清单每一项,在 audit 输出里 grep 对应关键词,按图标规则归类
|
|
272
|
+
4. **不可省略**:即使某项是 ✅,**也要列出来**;不能只列失败
|
|
273
|
+
5. **未覆盖项必须显式列出**:暴露脚本侧的盲区,作为后续补强依据
|
|
274
|
+
|
|
275
|
+
### 报告固定结构
|
|
276
|
+
|
|
277
|
+
```markdown
|
|
278
|
+
# 部署巡检报告
|
|
279
|
+
|
|
280
|
+
**目标:** {host}
|
|
281
|
+
**时间:** {iso8601}
|
|
282
|
+
**执行人:** {user}@{client}
|
|
283
|
+
**覆盖类别:** SSH / Nginx / DB / HTTPS / Env / Docker / Services / Resilience / Logs / Capacity / Secrets
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 摘要面板
|
|
288
|
+
|
|
289
|
+
| 指标 | 值 |
|
|
290
|
+
|------|---|
|
|
291
|
+
| 总检查项 | N |
|
|
292
|
+
| ✅ 通过 | A |
|
|
293
|
+
| ❌ 失败 | B |
|
|
294
|
+
| ⊘ 跳过 | C |
|
|
295
|
+
| ❓ 未覆盖 | D |
|
|
296
|
+
| **通过率** | **A / (A+B) = X%** |
|
|
297
|
+
|
|
298
|
+
**失败按等级:**
|
|
299
|
+
|
|
300
|
+
| 等级 | 数量 |
|
|
301
|
+
|------|------|
|
|
302
|
+
| 🔴 Critical | N |
|
|
303
|
+
| 🟠 High | N |
|
|
304
|
+
| 🟡 Medium | N |
|
|
305
|
+
| 🔵 Low | N |
|
|
306
|
+
| ⚪ Info | N |
|
|
307
|
+
|
|
308
|
+
**整体评估:** [一句话结论:可放行 / 需立即处理 / 建议优化]
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 完整检查清单
|
|
313
|
+
|
|
314
|
+
> 按 references 中 4.1-4.11 分组,每节一张表,节标题带通过率。
|
|
315
|
+
> 表头四列固定:`#` / `检查项` / `严重级` / `状态` / `实际值/备注`
|
|
316
|
+
|
|
317
|
+
### 4.1 SSH 安全 (8/10 ✅)
|
|
318
|
+
|
|
319
|
+
| # | 检查项 | 严重级 | 状态 | 实际值 / 备注 |
|
|
320
|
+
|---|--------|--------|------|--------------|
|
|
321
|
+
| 1 | PermitRootLogin | critical | ✅ | prohibit-password |
|
|
322
|
+
| 2 | PasswordAuthentication | high | ❌ | yes(期望 no) |
|
|
323
|
+
| 3 | PermitEmptyPasswords | critical | ✅ | no |
|
|
324
|
+
| 4 | Port | medium | ⊘ | sshd_config 不可读(无 sudo) |
|
|
325
|
+
| 5 | Protocol | high | ✅ | 2 |
|
|
326
|
+
| 6 | MaxAuthTries | medium | ✅ | 3 |
|
|
327
|
+
| 7 | LoginGraceTime | low | ❓ | audit 输出未提及该项 |
|
|
328
|
+
| 8 | AllowUsers / AllowGroups | medium | ❌ | 未配白名单 |
|
|
329
|
+
| 9 | sshd 日志可见 | high | ✅ | journalctl _COMM=sshd 有输出 |
|
|
330
|
+
| 10 | fail2ban / sshguard | medium | ⊘ | 未安装 |
|
|
331
|
+
|
|
332
|
+
### 4.2 Nginx 配置 (12/19 ✅)
|
|
333
|
+
[同上格式...]
|
|
334
|
+
|
|
335
|
+
### 4.3 数据库暴露 (PostgreSQL 6/7 ✅, Redis 7/8 ✅)
|
|
336
|
+
[同上格式,PG 与 Redis 各一张子表]
|
|
337
|
+
|
|
338
|
+
### 4.4 HTTPS 证书 (4/5 ✅)
|
|
339
|
+
[...]
|
|
340
|
+
|
|
341
|
+
### 4.5 环境变量 / 文件权限 (5/6 ✅)
|
|
342
|
+
[...]
|
|
343
|
+
|
|
344
|
+
### 4.6 Docker 安全 (10/17 ✅)
|
|
345
|
+
[...]
|
|
346
|
+
|
|
347
|
+
### 4.7 依赖服务连通性 (4/5 ✅)
|
|
348
|
+
[...]
|
|
349
|
+
|
|
350
|
+
### 4.8 自愈与资源耗尽防护 (B 节 9/10 + D 节 6/7)
|
|
351
|
+
[B 系统服务开机自启 + D 资源耗尽防护 各一张子表]
|
|
352
|
+
|
|
353
|
+
### 4.9 日志大小与防爆检查 (7/9 ✅)
|
|
354
|
+
[...]
|
|
355
|
+
|
|
356
|
+
### 4.10 硬件识别与资源推荐 (容器资源 5/7 + 日志推荐 4/5)
|
|
357
|
+
**包含"推荐 vs 当前"对比表(见 references/checks-runtime.md §4.10),保留原对比格式**
|
|
358
|
+
|
|
359
|
+
### 4.11 凭证强度审计 (12/15 ✅)
|
|
360
|
+
|
|
361
|
+
> **强制脱敏:** 不论 audit raw 输出包含什么,清单中**只能列** `key 名 / len / classes / strength / reason / 严重级`,不得出现密码片段、明文、md5/sha1 哈希。
|
|
362
|
+
|
|
363
|
+
| # | 凭证源 | 字段 | 严重级 | 状态 | 强度详情 |
|
|
364
|
+
|---|--------|------|--------|------|---------|
|
|
365
|
+
| 1 | .env (cloud/backend) | POSTGRES_PASSWORD | critical | ✅ | len=20 classes=4 STRONG |
|
|
366
|
+
| 2 | .env (cloud/backend) | REDIS_PASSWORD | critical | ✅ | len=20 classes=4 STRONG |
|
|
367
|
+
| 3 | .env (cloud/backend) | JWT_SECRET | high | ❌ | len=12 classes=2 MEDIUM(高敏字段建议 ≥ 32) |
|
|
368
|
+
| 4 | docker env (cloud-db) | POSTGRES_PASSWORD | critical | ✅ | len=20 classes=4 STRONG |
|
|
369
|
+
| 5 | Redis --requirepass | (cloud-redis-1) | critical | ✅ | len=20 classes=4 STRONG |
|
|
370
|
+
| 6 | frps.toml | auth.token | high | ⊘ | 未发现 frp 配置 |
|
|
371
|
+
| 7 | DolphinDB cluster.cfg | adminPassword | high | ⊘ | 未发现 DolphinDB 配置 |
|
|
372
|
+
| 8 | ~/.ssh/id_ed25519 | type+bits | high | ✅ | ED25519 perm=600 |
|
|
373
|
+
| 9 | ~/.ssh/id_rsa | type+bits | medium | ❌ | RSA-2048 perm=600(建议升 ed25519) |
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## 失败项详情(按严重级排序)
|
|
378
|
+
|
|
379
|
+
> 仅展开 ❌ 项,按 critical → high → medium → low 排序;每条一段。
|
|
380
|
+
|
|
381
|
+
### 🔴 [CRITICAL] PostgreSQL listen_addresses 设置为 *
|
|
382
|
+
|
|
383
|
+
- **类目:** 4.3 数据库暴露
|
|
384
|
+
- **位置:** /etc/postgresql/15/main/postgresql.conf:59
|
|
385
|
+
- **当前值:** `listen_addresses = '*'`
|
|
386
|
+
- **期望值:** `listen_addresses = 'localhost,10.0.0.0/8'`
|
|
387
|
+
- **风险:** 数据库监听所有网卡,若防火墙未拦截则公网可直接访问数据库
|
|
388
|
+
- **修复建议:**
|
|
389
|
+
1. 编辑 postgresql.conf 改为内网地址
|
|
390
|
+
2. 配合 pg_hba.conf 限制源 IP
|
|
391
|
+
3. 重载: `sudo systemctl reload postgresql`
|
|
392
|
+
- **参考:** https://www.postgresql.org/docs/current/runtime-config-connection.html
|
|
393
|
+
|
|
394
|
+
### 🟠 [HIGH] ...
|
|
395
|
+
|
|
396
|
+
[继续列出每条 ❌ 项,严格按等级降序]
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## 跳过项 (⊘)
|
|
401
|
+
|
|
402
|
+
> 透明化暴露:列出所有 ⊘ 项 + 跳过原因,让用户决定是否追加权限/装服务后重跑。
|
|
403
|
+
|
|
404
|
+
| 类目 | 检查项 | 跳过原因 |
|
|
405
|
+
|------|--------|---------|
|
|
406
|
+
| 4.1.4 SSH | Port | sshd_config 不可读(用户无 sudo) |
|
|
407
|
+
| 4.1.10 SSH | fail2ban / sshguard | 未安装 |
|
|
408
|
+
| ... | ... | ... |
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## 未覆盖项 (❓) — 暴露脚本盲区
|
|
413
|
+
|
|
414
|
+
> 这些项 references/checks-*.md 列了但 audit 输出没出现 — 说明脚本未实际检查或未输出该项判定。
|
|
415
|
+
> **行动:** 反馈到 dwy-deploy-audit skill 维护者,后续补强 check_*.sh。
|
|
416
|
+
|
|
417
|
+
| 类目 | 检查项 | 备注 |
|
|
418
|
+
|------|--------|------|
|
|
419
|
+
| 4.1.7 SSH | LoginGraceTime | check_ssh.sh 未输出该项 |
|
|
420
|
+
| ... | ... | ... |
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## 跨 skill 衍生建议
|
|
425
|
+
|
|
426
|
+
根据本次失败项归纳的可执行后续动作:
|
|
427
|
+
|
|
428
|
+
- 镜像版本不固定 (4.6) → 跑 `/dwy-docker-image` 选 N-1 minor
|
|
429
|
+
- daemon 未配 registry-mirrors (4.6) → 跑 `/dwy-mirror-source` 写国内源
|
|
430
|
+
- 容器资源偏离推荐 (4.10) → 改 `docker-compose.prod.yml` 的 mem_limit/maxmemory
|
|
431
|
+
- ...
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
## 未覆盖范围(本 skill 边界外)
|
|
436
|
+
|
|
437
|
+
- 未执行渗透测试(如需要,使用 `/dwy-pentest`)
|
|
438
|
+
- 未审计应用层逻辑(SQL 注入 / XSS 等)
|
|
439
|
+
- 未审计应用日志内容(只看大小,不看内容合规)
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## Step 6: 修复建议(只输出,不执行)
|
|
445
|
+
|
|
446
|
+
**严格禁止:**
|
|
447
|
+
|
|
448
|
+
- 自动执行任何修改命令
|
|
449
|
+
- 通过 SSH 直接修改服务器配置
|
|
450
|
+
- 重启任何服务
|
|
451
|
+
- 主动建议"我来帮你修复"
|
|
452
|
+
|
|
453
|
+
**允许:**
|
|
454
|
+
|
|
455
|
+
- 在报告中给出修复命令片段(供用户复制)
|
|
456
|
+
- 解释修复后的影响和验证方法
|
|
457
|
+
- 推荐修复优先级
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## 严重等级定义
|
|
462
|
+
|
|
463
|
+
| 等级 | 含义 | 示例 |
|
|
464
|
+
|------|------|------|
|
|
465
|
+
| **critical** | 公网可直接利用、数据可被直接访问、root 可被远程获取 | DB 公网暴露无密码、SSH 允许 root 密码登录 |
|
|
466
|
+
| **high** | 需特定条件可被利用,可能导致权限提升或敏感信息泄漏 | 弱 TLS、无 fail2ban、密码登录开启 |
|
|
467
|
+
| **medium** | 配置不规范但短期不致命,长期累积风险 | 默认端口、无 HSTS、autoindex 开 |
|
|
468
|
+
| **low** | 最佳实践类,可选改进 | OCSP Stapling、CSP header |
|
|
469
|
+
| **info** | 信息记录,非问题 | 当前 Nginx 版本号 |
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
## 禁止事项
|
|
474
|
+
|
|
475
|
+
- **禁止**未确认 SSH 连接信息就开始检查
|
|
476
|
+
- **禁止**执行任何写入命令(`sed -i`、`systemctl restart`、`echo > file`、`iptables -A` 等)
|
|
477
|
+
- **禁止**主动 `tcpdump` / `pg_dump` / `redis-cli FLUSHALL` 等高负载或破坏性命令
|
|
478
|
+
- **禁止**将检查结果中的敏感信息(密钥片段、密码哈希)完整输出到报告(必须脱敏)
|
|
479
|
+
- **禁止**在未获得用户明确授权时审计**非用户自有**的服务器(出现陌生 host 必须二次确认所有权)
|
|
480
|
+
- **禁止**自动修复发现的问题
|
|
481
|
+
- **禁止**省略 critical / high 等级的问题不报告
|