ЧАСТ 3: DevOps & Security инструменти - Docker, Python за автоматизация и още
За напреднали потребители, разработчици и ентусиасти на сигурността
DOCKER И КОНТЕЙНЕРИЗАЦИЯ
ОСНОВНИ DOCKER КОМАНДИ
Bash:
# Инсталиране на Docker
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl enable --now docker
sudo usermod -aG docker $USER # Добавяне на потребител в docker група
# Работа с образци (images)
docker pull ubuntu:22.04 # Изтегляне на образ
docker images # Показване на всички образци
docker rmi <image_id> # Изтриване на образ
docker build -t myapp:latest . # Създаване на образ
# Работа с контейнери
docker run -it ubuntu:22.04 /bin/bash # Стартиране на интерактивен контейнер
docker run -d -p 80:80 nginx # Стартиране в заден план
docker ps # Активни контейнери
docker ps -a # Всички контейнери
docker stop <container_id> # Спиране
docker start <container_id> # Стартиране
docker rm <container_id> # Изтриване
docker exec -it <container_id> bash # Влизане в работещ контейнер
# Мониторинг и логове
docker logs <container_id> # Показване на логове
docker logs -f <container_id> # Следене на логове в реално време
docker stats # Статистики за ресурсите
docker inspect <container_id> # Детайлна информация
ПРИМЕРЕН Dockerfile
Bash:
# Dockerfile за Python приложение
FROM python:3.9-slim
# Задаване на работна директория
WORKDIR /app
# Копиране на зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копиране на приложението
COPY . .
# Отваряне на порт
EXPOSE 8000
# Команда за стартиране
CMD ["python", "app.py"]
DOCKER-COMPOSE ЗА МНОГОКОНТЕЙНЕРНИ ПРИЛОЖЕНИЯ
YAML:
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: ./app
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
volumes:
- ./app:/app
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Bash:
# Сканиране на образ за уязвимости
docker scan <image_name>
# Изпълнение на контейнер с ограничени права
docker run --read-only --tmpfs /tmp alpine
# Използване на non-root потребител в контейнер
# В Dockerfile:
# USER 1000
# Проверка на конфигурация
docker bench-security # Инсталира се отделно
PYTHON ЗА АВТОМАТИЗАЦИЯ И СИГУРНОСТ
ПОЛЕЗНИ ПИТОН БИБЛИОТЕКИ ЗА ХАКЕРИ
Python:
# requirements.txt
requests>=2.25.0
beautifulsoup4>=4.9.0
scapy>=2.4.0
paramiko>=2.7.0
cryptography>=3.0
pwntools>=4.0
sqlmap # За инсталация: pip install sqlmap
nmap # pip install python-nmap
МРЕЖОВО СКЕНИРАНЕ С ПИТОН
Python:
#!/usr/bin/env python3
# network_scanner.py
import nmap
import socket
from concurrent.futures import ThreadPoolExecutor
def scan_port(ip, port):
"""Сканиране на един порт"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((ip, port))
sock.close()
if result == 0:
try:
service = socket.getservbyport(port)
except:
service = "unknown"
return port, service
except:
pass
return None
def full_scan(ip, start_port=1, end_port=1024):
"""Пълно сканиране на портове"""
print(f"[*] Сканиране на {ip}")
open_ports = []
with ThreadPoolExecutor(max_workers=100) as executor:
futures = []
for port in range(start_port, end_port + 1):
futures.append(executor.submit(scan_port, ip, port))
for future in futures:
result = future.result()
if result:
port, service = result
print(f"[+] Порт {port} ({service}) е ОТВОРЕН")
open_ports.append((port, service))
return open_ports
# Използване
if __name__ == "__main__":
target = "192.168.1.1"
open_ports = full_scan(target)
print(f"\nОткрити {len(open_ports)} отворени порта")
ПЕНТЕСТ ИНСТРУМЕНТИ НА ПИТОН
Python:
#!/usr/bin/env python3
# basic_pentest_tool.py
import requests
import re
from urllib.parse import urljoin
class SimplePentestTool:
def __init__(self, target_url):
self.target_url = target_url
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Pentest Tool)'
})
def check_sql_injection(self):
"""Проверка за базови SQL инжекции"""
test_payloads = ["'", "\"", "' OR '1'='1", "' UNION SELECT null--"]
for payload in test_payloads:
test_url = f"{self.target_url}?id={payload}"
try:
response = self.session.get(test_url, timeout=5)
# Проверка за грешки в базата данни
error_patterns = [
"SQL syntax",
"MySQL",
"PostgreSQL",
"ORA-",
"Microsoft.*Database"
]
for pattern in error_patterns:
if re.search(pattern, response.text, re.IGNORECASE):
print(f"[!] Възможна SQL инжекция с payload: {payload}")
return True
except:
continue
return False
def directory_bruteforce(self, wordlist_path):
"""Брутфорс на директории"""
common_dirs = [
"admin", "login", "wp-admin", "backend",
"phpmyadmin", "test", "backup", "api"
]
print("[*] Търсене на директории...")
for directory in common_dirs:
url = urljoin(self.target_url, directory)
try:
response = self.session.get(url, timeout=3)
if response.status_code == 200:
print(f"[+] Намерена директория: {url}")
elif response.status_code == 403:
print(f"[!] Забранен достъп: {url}")
except:
pass
def check_headers(self):
"""Проверка на HTTP хедъри за сигурност"""
response = self.session.get(self.target_url)
headers = response.headers
security_headers = {
'X-Frame-Options': 'Защита от clickjacking',
'X-Content-Type-Options': 'Защита от MIME sniffing',
'X-XSS-Protection': 'Защита от XSS',
'Content-Security-Policy': 'CSP политика',
'Strict-Transport-Security': 'HSTS'
}
print("[*] Проверка на сигурностните хедъри:")
for header, description in security_headers.items():
if header in headers:
print(f" [+] {header}: {headers[header]} ({description})")
else:
print(f" [-] Липсва: {header} ({description})")
# Използване
if __name__ == "__main__":
tool = SimplePentestTool("http://testphp.vulnweb.com")
tool.check_headers()
tool.check_sql_injection()
tool.directory_bruteforce("common_dirs.txt")
АВТОМАТИЗАЦИЯ НА РЕПЕТИТИВНИ ЗАДАЧИ
Python:
#!/usr/bin/env python3
# automation_bot.py
import os
import subprocess
import logging
from datetime import datetime
from pathlib import Path
class AutomationBot:
def __init__(self, config_file="bot_config.json"):
self.config = self.load_config(config_file)
self.setup_logging()
def setup_logging(self):
"""Настройка на логването"""
log_dir = Path("logs")
log_dir.mkdir(exist_ok=True)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(f"logs/automation_{datetime.now():%Y%m%d}.log"),
logging.StreamHandler()
]
)
self.logger = logging.getLogger(__name__)
def run_command(self, command, description=""):
"""Изпълнение на shell команда с логване"""
self.logger.info(f"Изпълнявам: {description}")
self.logger.debug(f"Команда: {command}")
try:
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
timeout=300
)
if result.returncode == 0:
self.logger.info(f"Успешно: {description}")
if result.stdout:
self.logger.debug(f"Изход:\n{result.stdout}")
else:
self.logger.error(f"Грешка: {description}")
self.logger.error(f"STDERR:\n{result.stderr}")
return result
except subprocess.TimeoutExpired:
self.logger.error(f"Таймаут: {description}")
except Exception as e:
self.logger.error(f"Неочаквана грешка: {e}")
return None
def daily_backup(self):
"""Дневен бекъп на важни данни"""
backup_dir = Path(f"backups/{datetime.now():%Y%m%d}")
backup_dir.mkdir(parents=True, exist_ok=True)
tasks = [
{
"cmd": f"tar -czf {backup_dir}/etc_backup.tar.gz /etc",
"desc": "Бекъп на /etc директория"
},
{
"cmd": f"mysqldump -u root --all-databases > {backup_dir}/mysql_backup.sql",
"desc": "Бекъп на MySQL бази"
},
{
"cmd": f"rsync -av /var/www {backup_dir}/",
"desc": "Бекъп на уебсайтове"
}
]
self.logger.info("Стартиране на дневен бекъп")
for task in tasks:
self.run_command(task["cmd"], task["desc"])
# Почистване на стари бекъпове
self.cleanup_old_backups()
def cleanup_old_backups(self, days_to_keep=7):
"""Почистване на стари бекъпове"""
backup_root = Path("backups")
if not backup_root.exists():
return
cutoff_date = datetime.now().timestamp() - (days_to_keep * 86400)
for backup_dir in backup_root.iterdir():
if backup_dir.is_dir():
dir_mtime = backup_dir.stat().st_mtime
if dir_mtime < cutoff_date:
self.logger.info(f"Изтривам стар бекъп: {backup_dir}")
subprocess.run(["rm", "-rf", str(backup_dir)])
def system_health_check(self):
"""Проверка на здравословното състояние на системата"""
checks = [
("df -h", "Дисково пространство"),
("free -h", "Свободна памет"),
("uptime", "Зареждане на системата"),
("ss -tuln | grep LISTEN", "Отворени портове"),
("journalctl -xe --since '1 hour ago' | tail -20", "Последни грешки")
]
self.logger.info("Проверка на системата")
for cmd, desc in checks:
result = self.run_command(cmd, desc)
if result and result.stdout:
print(f"\n=== {desc} ===")
print(result.stdout)
def monitor_logs(self, log_files, keywords):
"""Мониторинг на логове за ключови думи"""
for log_file in log_files:
if Path(log_file).exists():
self.logger.info(f"Мониторинг на {log_file}")
try:
with open(log_file, 'r') as f:
lines = f.readlines()[-100:] # Последните 100 реда
for line in lines:
for keyword in keywords:
if keyword.lower() in line.lower():
self.logger.warning(f"Намерено в {log_file}: {line.strip()}")
except Exception as e:
self.logger.error(f"Грешка при четене на {log_file}: {e}")
# Примерна конфигурация
if __name__ == "__main__":
bot = AutomationBot()
# Изпълняване на дневни задачи
bot.daily_backup()
bot.system_health_check()
# Мониторинг на логове
log_files = ["/var/log/syslog", "/var/log/auth.log"]
alert_keywords = ["error", "failed", "denied", "attack", "intrusion"]
bot.monitor_logs(log_files, alert_keywords)
ОСНОВНИ KUBERNETES КОМАНДИ
Bash:
# Инсталиране на minikube (локален K8s)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start
# Основни kubectl команди
kubectl get pods # Всички подове
kubectl get pods -n <namespace> # Подове в определен namespace
kubectl get deployments # Деплоймънти
kubectl get services # Сървиси
kubectl get nodes # Нодове в клъстъра
kubectl describe pod <pod_name> # Детайли за под
kubectl logs <pod_name> # Логове от под
kubectl exec -it <pod_name> -- /bin/bash # Влизане в под
kubectl apply -f deployment.yaml # Прилагане на конфигурация
kubectl delete -f deployment.yaml # Изтриване
kubectl scale deployment <name> --replicas=3 # Скалиране
ПРИМЕРЕН KUBERNETES DEPLOYMENT
YAML:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
CI/CD С АВТОМАТИЗАЦИЯ
GITHUB ACTIONS ПРИМЕР
YAML:
# .github/workflows/security-scan.yml
name: Security Scan
on: [push, pull_request]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run Bandit (Python security)
run: |
pip install bandit
bandit -r . -f json -o bandit-report.json
- name: Run Trivy (Container scan)
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:latest'
format: 'sarif'
output: 'trivy-results.sarif'
- name: Dependency check
uses: dependency-check/Dependency-Check_Action@main
with:
project: 'MyApp'
path: '.'
format: 'HTML'
- name: Upload reports
uses: actions/upload-artifact@v2
with:
name: security-reports
path: |
bandit-report.json
trivy-results.sarif
dependency-check-report.html
JENKINS PIPELINE ПРИМЕР
Bash:
// Jenkinsfile
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/my/repo.git'
}
}
stage('Build') {
steps {
sh 'docker build -t myapp:${BUILD_ID} .'
}
}
stage('Test') {
steps {
sh 'docker run myapp:${BUILD_ID} pytest'
sh 'docker run --security-opt=no-new-privileges myapp:${BUILD_ID} security-scan'
}
}
stage('Scan') {
steps {
sh 'trivy image myapp:${BUILD_ID}'
sh 'dockle myapp:${BUILD_ID}'
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
sh 'kubectl apply -f k8s/deployment.yaml'
sh 'kubectl rollout status deployment/myapp'
}
}
}
post {
always {
cleanWs()
}
success {
slackSend(color: 'good', message: "Build ${BUILD_ID} успешен!")
}
failure {
slackSend(color: 'danger', message: "Build ${BUILD_ID} неуспешен!")
}
}
}
ПРАКТИЧЕСКИ ПРОЕКТИ ЗА УПРАЖНЕНИЕ
ПРОЕКТ 1: Автоматизиран пентест скрипт
Python:
#!/usr/bin/env python3
# auto_pentest.py
"""
Функционалности:
1. Сканиране на портове
2. Търсене на уязвими директории
3. Проверка за SQL инжекции
4. Тест за XSS
5. Генериране на отчет
"""
# Имплементация...
ПРОЕКТ 2: Dockerized уеб приложение с мониторинг
Bash:
# Структура:
myapp/
├── docker-compose.yml
├── backend/
│ ├── Dockerfile
│ └── src/
├── frontend/
│ ├── Dockerfile
│ └── src/
├── monitoring/
│ ├── prometheus.yml
│ └── grafana.ini
└── database/
└── init.sql
ПРОЕКТ 3: Kubernetes клъстър за уроци
Bash:
# Стъпки:
1. Инсталиране на minikube/k3s
2. Деploy на уеб приложение
3. Конфигуриране на ingress
4. Настройване на autoscaling
5. Мониторинг с Prometheus + Grafana
РЕСУРСИ И НАСОКИ
ПОЛЕЗНИ САЙТОВЕ
- OWASP - Уеб сигурност
- Docker Docs - Официална документация
- Kubernetes.io - K8s документация
- Python Security - Bandit за анализ
- TryHackMe - Практика по сигурност
КНИГИ
- "Black Hat Python" - Justin Seitz
- "The Docker Book" - James Turnbull
- "Kubernetes in Action" - Marko Luksa
- "Web Application Security" - Andrew Hoffman
ОНЛАЙН КУРСОВЕ
- Docker Mastery (Udemy)
- Kubernetes for Beginners (YouTube)
- Python for Pentesters
⚠ ВАЖНИ ПРЕДУПРЕЖДЕНИЯ И ЕТИКА
КАКВО НЕ ПРАВИМ
- Не тествайте върху системи, които не ви принадлежат
- Не използвайте инструментите за злонамерени цели
- Спазвайте законите и регулациите
- Винаги имайте писмено разрешение за пентест
ЕТИЧЕН ХАКИНГ
- Вземи разрешение преди тестване
- Докладвай намерените уязвимости
- Съхранявай данните конфиденциално
- Учи и споделяй знанията
СЪВЕТИ ЗА РАЗВИТИЕ
- Започни с основите - разбирай как работи мрежата
- Практикувай в сигурна среда - виртуални машини, лаборатории
- Следвай блогове и форуми - Reddit, Stack Overflow, специализирани форуми
- Участвай в CTF състезания - HackTheBox, TryHackMe
- Кontributвай към open-source проекти
ЧЕСТО ЗАДАВАНИ ВЪПРОСИ
Q: Откъде да започна с Docker?A: Инсталирай Docker Desktop или Docker Engine, и започни с docker run hello-world
Q: Нужно ли е да знам Python за сигурност?
A: Не е задължително, но значително ще ти помогне за автоматизация
Q: Мога ли да практикувам сигурност легално?
A: Да! Използвай сайтове като HackTheBox, TryHackMe, или си създай собствена лаборатория
Q: Колко време отнема да се науча?
A: Зависи от времето, което отделяш. С 2-3 часа на ден, за 6 месеца можеш да станеш компетентен
Създадено с
Last edited: