Files
links/scripts/ci/security-scan.sh
Andrey K. Choi d5f1809f5a
Some checks failed
continuous-integration/drone Build is failing
Drone CD/CD PipeLine added
2025-11-02 06:23:39 +09:00

208 lines
7.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# scripts/ci/security-scan.sh - Сканирование безопасности
set -e
echo "🔒 Running security scans..."
# Создание директории для отчетов
mkdir -p /tmp/security-reports
# 1. Сканирование зависимостей
echo "📦 Scanning dependencies for vulnerabilities..."
# Python зависимости
if [ -f "backend/requirements.txt" ]; then
echo " • Scanning Python dependencies..."
docker run --rm -v "$(pwd)/backend:/app" -w /app python:3.11-slim bash -c "
pip install safety bandit > /dev/null 2>&1
echo 'Python Safety Report:' > /tmp/safety-report.txt
safety check -r requirements.txt --output text >> /tmp/safety-report.txt 2>&1 || echo 'Safety scan completed with findings'
cat /tmp/safety-report.txt
" | tee /tmp/security-reports/python-dependencies.txt
fi
# Node.js зависимости
if [ -f "frontend/linktree-frontend/package.json" ]; then
echo " • Scanning Node.js dependencies..."
docker run --rm -v "$(pwd)/frontend/linktree-frontend:/app" -w /app node:20-alpine sh -c "
npm install --silent > /dev/null 2>&1
npm audit --audit-level moderate 2>&1 || echo 'npm audit completed with findings'
" | tee /tmp/security-reports/nodejs-dependencies.txt
fi
# 2. Сканирование кода на уязвимости
echo "🔍 Scanning source code for security issues..."
# Python код
if [ -d "backend" ]; then
echo " • Scanning Python code with Bandit..."
docker run --rm -v "$(pwd)/backend:/app" -w /app python:3.11-slim bash -c "
pip install bandit > /dev/null 2>&1
bandit -r . -f txt 2>&1 || echo 'Bandit scan completed'
" | tee /tmp/security-reports/python-code-scan.txt
fi
# 3. Сканирование Docker образов
echo "🐳 Scanning Docker images..."
# Получение списка образов проекта
images=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep -E "(catlink|links)" | head -5)
for image in $images; do
echo " • Scanning image: $image"
# Используем простую проверку уязвимостей через docker history
echo " - Checking image layers..."
docker history "$image" --no-trunc | head -10
# Проверка на известные уязвимые базовые образы
echo " - Checking base image..."
base_image=$(docker inspect "$image" | grep -o '"FROM [^"]*"' | head -1 || echo "unknown")
echo " Base image: $base_image"
done > /tmp/security-reports/docker-scan.txt
# 4. Сканирование конфигурации
echo "⚙️ Scanning configuration files..."
# Проверка .env файлов на потенциальные проблемы
echo " • Checking environment configuration..."
if [ -f ".env" ]; then
echo " - Checking for hardcoded secrets in .env..."
# Проверка на слабые пароли или ключи
if grep -qi "password.*123\|secret.*test\|key.*test" .env; then
echo " ⚠️ Weak passwords or test keys found in .env"
else
echo " ✅ No obvious weak credentials in .env"
fi
# Проверка на отладочный режим в продакшене
if grep -q "DEBUG.*True" .env; then
echo " ⚠️ DEBUG mode is enabled"
else
echo " ✅ DEBUG mode is properly configured"
fi
fi
# Проверка Docker Compose на небезопасные настройки
echo " • Checking Docker Compose security..."
if [ -f "docker-compose.yml" ]; then
# Проверка на privileged режим
if grep -q "privileged.*true" docker-compose.yml; then
echo " ⚠️ Privileged containers found"
else
echo " ✅ No privileged containers"
fi
# Проверка на монтирование Docker socket
if grep -q "/var/run/docker.sock" docker-compose.yml; then
echo " ⚠️ Docker socket is mounted (potential security risk)"
else
echo " ✅ Docker socket is not exposed"
fi
fi > /tmp/security-reports/config-scan.txt
# 5. Проверка сетевой безопасности
echo "🌐 Checking network security..."
# Проверка открытых портов
echo " • Checking exposed ports..."
open_ports=$(docker-compose ps --services | xargs -I {} docker-compose port {} 2>/dev/null | grep -v "No container" || true)
if [ -n "$open_ports" ]; then
echo " Exposed ports:"
echo "$open_ports"
else
echo " No exposed ports found"
fi > /tmp/security-reports/network-scan.txt
# 6. Проверка SSL/TLS конфигурации
echo "🔐 Checking SSL/TLS configuration..."
# Проверка наличия SSL настроек
if [ -f "nginx.conf" ] || [ -f "docker-compose.ssl.yml" ]; then
echo " • SSL configuration found"
# Проверка на использование слабых протоколов
if grep -r "ssl_protocols.*TLSv1[^.2]" . 2>/dev/null; then
echo " ⚠️ Weak TLS protocols detected"
else
echo " ✅ TLS configuration appears secure"
fi
else
echo " • No SSL configuration found (consider adding for production)"
fi >> /tmp/security-reports/ssl-scan.txt
# 7. Создание сводного отчета
echo "📊 Generating security summary..."
cat > /tmp/security-reports/security-summary.txt << EOF
CatLink Security Scan Summary
============================
Scan Date: $(date)
Commit: ${DRONE_COMMIT_SHA:-"local"}
Branch: ${DRONE_BRANCH:-"local"}
Scans Performed:
✓ Dependency vulnerability scan
✓ Source code security scan
✓ Docker image security scan
✓ Configuration security check
✓ Network security assessment
✓ SSL/TLS configuration review
Reports Generated:
- python-dependencies.txt
- nodejs-dependencies.txt
- python-code-scan.txt
- docker-scan.txt
- config-scan.txt
- network-scan.txt
- ssl-scan.txt
Recommendations:
1. Review dependency vulnerabilities and update packages
2. Address any code security issues found by static analysis
3. Keep Docker base images updated
4. Use strong passwords and secrets management
5. Enable SSL/TLS for production deployments
6. Regular security scans in CI/CD pipeline
For detailed findings, check individual report files.
EOF
# Подсчет найденных проблем
echo "📈 Security scan statistics..."
total_issues=0
# Подсчет проблем в зависимостях
if [ -f "/tmp/security-reports/python-dependencies.txt" ]; then
python_issues=$(grep -c "vulnerability\|CRITICAL\|HIGH" /tmp/security-reports/python-dependencies.txt 2>/dev/null || echo "0")
echo " • Python dependency issues: $python_issues"
total_issues=$((total_issues + python_issues))
fi
if [ -f "/tmp/security-reports/nodejs-dependencies.txt" ]; then
node_issues=$(grep -c "vulnerability\|critical\|high" /tmp/security-reports/nodejs-dependencies.txt 2>/dev/null || echo "0")
echo " • Node.js dependency issues: $node_issues"
total_issues=$((total_issues + node_issues))
fi
echo " • Total security issues found: $total_issues"
# Вывод результатов
echo ""
echo "🔒 Security scan completed!"
echo "📁 Reports saved to /tmp/security-reports/"
echo ""
cat /tmp/security-reports/security-summary.txt
# Не фейлим build на проблемах безопасности, но выводим предупреждение
if [ "$total_issues" -gt 0 ]; then
echo ""
echo "⚠️ Security issues detected! Please review the reports."
echo " This is informational and does not fail the build."
fi
echo "✅ Security scan stage completed."