-
Notifications
You must be signed in to change notification settings - Fork 25
180 lines (150 loc) · 5.94 KB
/
Copy pathsecurity-scan.yml
File metadata and controls
180 lines (150 loc) · 5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
name: Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
# Run security scan weekly
- cron: '0 2 * * 1'
jobs:
secret-scan:
runs-on: ubuntu-latest
name: Secret Detection
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run TruffleHog OSS
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: main
head: HEAD
extra_args: --debug --only-verified
dependency-scan:
runs-on: ubuntu-latest
name: Dependency Vulnerability Scan
steps:
- uses: actions/checkout@v4
- name: Scan for vulnerable dependencies
run: |
echo "Scanning for vulnerable dependencies..."
# Find all package.json files
find . -name "package.json" -not -path "./node_modules/*" | while read -r package_file; do
echo "Scanning: $package_file"
dir=$(dirname "$package_file")
if command -v npm >/dev/null 2>&1; then
cd "$dir"
npm audit --audit-level=high || echo "❌ Vulnerabilities found in $package_file"
cd - > /dev/null
fi
done
# Find all requirements.txt files
find . -name "requirements.txt" -not -path "./venv/*" | while read -r req_file; do
echo "Found Python requirements: $req_file"
echo "⚠️ Consider using 'pip-audit' for Python dependency scanning"
done
# Find all go.mod files
find . -name "go.mod" | while read -r go_file; do
echo "Found Go module: $go_file"
echo "⚠️ Consider using 'nancy' or 'govulncheck' for Go dependency scanning"
done
dockerfile-scan:
runs-on: ubuntu-latest
name: Dockerfile Security Scan
steps:
- uses: actions/checkout@v4
- name: Run Hadolint
uses: hadolint/hadolint-action@v3.1.0
with:
dockerfile: "**/Dockerfile*"
failure-threshold: warning
format: sarif
output-file: hadolint-results.sarif
- name: Upload Hadolint results
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: hadolint-results.sarif
compose-security:
runs-on: ubuntu-latest
name: Docker Compose Security Check
steps:
- uses: actions/checkout@v4
- name: Security check for Docker Compose files
run: |
echo "Checking Docker Compose files for security issues..."
# Find all docker-compose files
find . -name "docker-compose.y*ml" | while read -r compose_file; do
echo "Checking: $compose_file"
# Check for privileged containers
if grep -q "privileged.*true" "$compose_file"; then
echo "❌ Privileged container found in: $compose_file"
fi
# Check for host network mode
if grep -q "network_mode.*host" "$compose_file"; then
echo "⚠️ Host network mode found in: $compose_file"
fi
# Check for dangerous volume mounts
if grep -q "/var/run/docker.sock" "$compose_file"; then
echo "❌ Docker socket mount found in: $compose_file"
fi
if grep -q ":/proc" "$compose_file"; then
echo "⚠️ /proc mount found in: $compose_file"
fi
# Check for exposed sensitive ports
if grep -E "ports:.*:(22|3306|5432|6379|27017|9200)" "$compose_file"; then
echo "⚠️ Sensitive ports exposed in: $compose_file"
fi
# Check for missing restart policies
if ! grep -q "restart:" "$compose_file"; then
echo "ℹ️ No restart policy specified in: $compose_file"
fi
done
code-security:
runs-on: ubuntu-latest
name: Code Security Analysis
steps:
- uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: javascript, python, go
queries: security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:javascript,python,go"
security-summary:
runs-on: ubuntu-latest
needs: [secret-scan, dependency-scan, dockerfile-scan, compose-security, code-security]
if: always()
name: Security Summary
steps:
- name: Security Scan Summary
run: |
echo "## Security Scan Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Check job results
secret_result="${{ needs.secret-scan.result }}"
dependency_result="${{ needs.dependency-scan.result }}"
dockerfile_result="${{ needs.dockerfile-scan.result }}"
compose_result="${{ needs.compose-security.result }}"
code_result="${{ needs.code-security.result }}"
echo "| Security Check | Status |" >> $GITHUB_STEP_SUMMARY
echo "|----------------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Secret Detection | $secret_result |" >> $GITHUB_STEP_SUMMARY
echo "| Dependency Scan | $dependency_result |" >> $GITHUB_STEP_SUMMARY
echo "| Dockerfile Scan | $dockerfile_result |" >> $GITHUB_STEP_SUMMARY
echo "| Compose Security | $compose_result |" >> $GITHUB_STEP_SUMMARY
echo "| Code Analysis | $code_result |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Overall status
if [[ "$secret_result $dependency_result $dockerfile_result $compose_result $code_result" == *"failure"* ]]; then
echo "🔴 **Security issues detected!** Please review the scan results." >> $GITHUB_STEP_SUMMARY
else
echo "🟢 **All security scans passed successfully.**" >> $GITHUB_STEP_SUMMARY
fi