Пример 1: Анализ логов (регулярные выражения + grep)
bash
# Создадим тестовый лог-файл с разными IP cat > /var/log/test.log << EOF 2024-01-15 10:30:45 192.168.1.1 GET /api/users 2024-01-15 10:31:22 10.0.0.5 POST /api/auth 2024-01-15 10:32:01 192.168.1.15 ERROR /api/payment 2024-01-15 10:33:44 192.168.1.1 GET /api/products INVALID_LINE без IP 2024-01-15 10:34:12 10.0.0.8 GET /api/users EOF # 1. Найти все строки с IP 192.168.1.1 grep '192\.168\.1\.1' /var/log/test.log # 2. Найти все POST запросы grep 'POST' /var/log/test.log # 3. Найти строки, начинающиеся с даты grep '^2024' /var/log/test.log # 4. Найти строки с ERROR (без учета регистра) grep -i 'error' /var/log/test.log # 5. Найти все IP адреса в файле (простое регулярное выражение) grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' /var/log/test.log
Задача 1.1: Анализ SSH логов
text
1. Создайте файл /tmp/ssh.log с содержимым: Jan 15 10:30:45 server sshd[1234]: Failed password for root from 192.168.1.100 Jan 15 10:31:22 server sshd[1235]: Accepted password for user from 10.0.0.50 Jan 15 10:32:01 server sshd[1236]: Invalid user hacker from 203.0.113.5 Jan 15 10:33:44 server sshd[1237]: Failed password for admin from 192.168.1.100 2. Используя grep, найдите: - Все неудачные попытки входа (Failed) - Все IP адреса, с которых были атаки - Все строки с "Invalid user" - Подсчитайте, сколько раз атаковали с 192.168.1.100
Пример 2: Работа с конфигурационными файлами
bash
# Создаем конфиг nginx для практики
cat > /tmp/nginx.conf << EOF
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/html;
index index.html;
}
location /api {
proxy_pass http://localhost:3000;
}
# Запрещаем доступ к .htaccess
location ~ /\.ht {
deny all;
}
}
EOF
# 1. Показать все строки с 'location'
grep 'location' /tmp/nginx.conf
# 2. Показать строки, начинающиеся с server или location
grep -E '^(server|location)' /tmp/nginx.conf
# 3. Найти закрывающие фигурные скобки
grep '^}' /tmp/nginx.conf
# 4. Найти все домены (пример.com)
grep -o '[a-z]\+\.example\.com' /tmp/nginx.conf
Задача 2.1: Настройка firewall правил
text
1. Создайте файл /tmp/firewall.rules: # Правила для веб-сервера ALLOW 192.168.1.0/24 -> 80,443 ALLOW 10.0.0.5 -> 22 DENY 203.0.113.0/24 -> ALL ALLOW 192.168.1.100 -> 3306 2. Используя grep и регулярные выражения: - Выведите только строки с ALLOW - Найдите все IP/подсети - Найдите все порты (цифры после ->) - Подсчитайте количество правил для 192.168.1.0/24
Пример 3: Мониторинг системы + регулярки
bash
# 1. Проверка запущенных процессов ps aux | grep -E '(nginx|apache|httpd)' # 2. Поиск файлов по шаблону find /var/log -name "*.log" -type f | grep -E '(error|access)' # 3. Анализ использования диска df -h | grep -E '(/dev/sd|/dev/nvme)' # 4. Проверка сетевых соединений ss -tuln | grep -E ':(80|443|22)' # 5. Поиск в истории команд history | grep -E '^(sudo|ssh|scp)'
Задача 3.1: Мониторинг безопасности
text
1. Проверьте, какие пользователи могут использовать sudo: sudo grep -E '^[^#].*ALL=' /etc/sudoers /etc/sudoers.d/* 2. Найдите все исполняемые файлы в /tmp (опасно!): find /tmp -type f -executable 2>/dev/null | head -5 3. Проверьте открытые сетевые порты на localhost: ss -tuln | grep -E '127\.0\.0\.1' 4. Найдите файлы с правами SUID (потенциальная уязвимость): find /usr/bin -type f -perm -4000 2>/dev/null
🔧 Реальные сценарии для практики
Сценарий 1: Резервное копирование логов
bash
#!/bin/bash
# backup_logs.sh - реальный скрипт бэкапа
# 1. Создаем директорию для бэкапов с датой
BACKUP_DIR="/var/backups/logs/$(date +%Y-%m-%d)"
mkdir -p "$BACKUP_DIR"
# 2. Копируем логи за последние 7 дней
find /var/log -name "*.log" -mtime -7 -exec cp {} "$BACKUP_DIR" \;
# 3. Архивируем
tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
# 4. Удаляем временную директорию
rm -rf "$BACKUP_DIR"
# 5. Удаляем архивы старше 30 дней
find /var/backups/logs -name "*.tar.gz" -mtime +30 -delete
echo "Backup completed: $BACKUP_DIR.tar.gz"
Задача 4.1: Улучшите скрипт бэкапа
text
Доработайте скрипт backup_logs.sh: 1. Добавьте проверку свободного места на диске перед бэкапом 2. Добавьте логирование действий в /var/log/backup.log 3. Добавьте отправку email при ошибке (можно имитировать echo) 4. Сделайте проверку, что директория /var/log существует 5. Используйте регулярные выражения для выбора только нужных логов
Сценарий 2: Мониторинг веб-сервера
bash
#!/bin/bash
# check_website.sh - проверка доступности сайта
SITE="http://localhost"
LOG_FILE="/var/log/website_check.log"
PATTERN="200 OK|301 Moved"
# Проверяем доступность
response=$(curl -s -I "$SITE" 2>/dev/null | head -1)
if echo "$response" | grep -E "$PATTERN" > /dev/null; then
echo "$(date): $SITE is UP - $response" >> "$LOG_FILE"
else
echo "$(date): $SITE is DOWN - $response" >> "$LOG_FILE"
# Можно добавить оповещение
echo "ALERT: Website is down!" | mail -s "Site Down" admin@example.com
fi
# Анализ лога за последний час
error_count=$(grep -c "DOWN" "$LOG_FILE")
if [ "$error_count" -gt 3 ]; then
echo "WARNING: Multiple failures detected"
fi
Задача 4.2: Создайте мониторинг сервисов
text
Создайте скрипт monitor_services.sh который: 1. Проверяет, что службы nginx, sshd, postgresql запущены 2. Если служба не запущена - пытается её перезапустить 3. Логирует все события 4. Отправляет алерт, если службу не удалось запустить 5. Использует регулярки для поиска в выводе systemctl
📊 Регулярные выражения — минимум для старта
Базовые шаблоны:
bash
# . - любой один символ grep '192.168.1.' access.log # Найдет 192.168.1.1, 192.168.1.10 и т.д. # * - ноль или больше повторений предыдущего grep 'error.*failed' logfile # Найдет "error: operation failed" # ^ - начало строки grep '^Starting' service.log # Строки, начинающиеся с Starting # $ - конец строки grep 'OK$' status.log # Строки, заканчивающиеся на OK # [ ] - набор символов grep '[0-9]' file.txt # Строки, содержащие цифры grep '[a-zA-Z]' file.txt # Строки, содержащие буквы # \ - экранирование специальных символов grep '192\.168\.1\.1' logfile # Точная строка с точками
Практика с регулярками:
bash
# Создадим тестовый файл
cat > /tmp/data.txt << EOF
user1:password123:active
user2:pass:inactive
admin:Admin@123:active
test:test:active
EOF
# 1. Найти пользователей с активным статусом
grep ':active$' /tmp/data.txt
# 2. Найти пароли длиннее 6 символов
grep -E ':[a-zA-Z0-9@]{7,}:' /tmp/data.txt
# 3. Найти пользователей, начинающихся с 'user'
grep '^user' /tmp/data.txt
# 4. Найти строки, содержащие цифры в пароле
grep -E ':[^:]*[0-9][^:]*:' /tmp/data.txt
Задача 5: Валидация конфигурации
text
Создайте скрипт validate_config.sh для проверки конфигурации: 1. Проверьте, что в /etc/ssh/sshd_config: - Port установлен в 22 - PasswordAuthentication отключен - PermitRootLogin отключен 2. Валидация IP адресов в конфиге: - Найти все IPv4 адреса - Проверить, что нет приватных IP в публичных правилах 3. Проверка синтаксиса nginx конфига: sudo nginx -t 2>&1 | grep -E 'successful|error'
🎓 Итоговый проект: Linux Администратор 1-го уровня
Проект: Настройка и аудит тестового сервера
bash
#!/bin/bash # server_audit.sh - комплексный аудит сервера LOG_FILE="/var/log/server_audit_$(date +%Y%m%d).log" echo "=== SERVER AUDIT REPORT ===" > "$LOG_FILE" echo "Date: $(date)" >> "$LOG_FILE" echo "Hostname: $(hostname)" >> "$LOG_FILE" echo "" >> "$LOG_FILE" # 1. Проверка обновлений безопасности echo "1. SECURITY UPDATES:" >> "$LOG_FILE" apt list --upgradable 2>/dev/null | grep -E 'security|ubuntu' >> "$LOG_FILE" # 2. Проверка открытых портов echo "" >> "$LOG_FILE" echo "2. OPEN PORTS:" >> "$LOG_FILE" ss -tuln | grep -E 'LISTEN' >> "$LOG_FILE" # 3. Проверка пользователей echo "" >> "$LOG_FILE" echo "3. USER ACCOUNTS:" >> "$LOG_FILE" grep -E ':/bin/(bash|sh)' /etc/passwd >> "$LOG_FILE" # 4. Проверка cron заданий echo "" >> "$LOG_FILE" echo "4. CRON JOBS:" >> "$LOG_FILE" crontab -l 2>/dev/null | grep -v '^#' >> "$LOG_FILE" # 5. Проверка дискового пространства echo "" >> "$LOG_FILE" echo "5. DISK USAGE:" >> "$LOG_FILE" df -h | grep -E '^/dev/' >> "$LOG_FILE" # 6. Поиск больших файлов echo "" >> "$LOG_FILE" echo "6. LARGE FILES (>100MB):" >> "$LOG_FILE" find / -type f -size +100M 2>/dev/null | head -10 >> "$LOG_FILE" echo "" >> "$LOG_FILE" echo "Audit complete. Report saved to: $LOG_FILE"
Итоговые задачи:
text
1. Запустите server_audit.sh и проанализируйте вывод 2. Найдите в выводе все IP адреса (регулярные выражения) 3. Определите, какие обновления security доступны 4. Проверьте, нет ли аномалий в cron заданиях 5. Составьте план действий по результатам аудита
💡 Советы для эффективной практики:
- Создайте тестовую среду в VirtualBox или используйте WSL2
- Ломайте систему нарочно, потом чините — лучший способ научиться
- Документируйте все команды, которые используете
- Автоматизируйте повторяющиеся задачи сразу
- Читайте логи — они расскажут всё о системе
Ключевые команды для запоминания:
bash
# Для анализа
grep -E 'pattern' file # Расширенные регулярки
grep -v 'exclude' file # Исключение шаблона
grep -c 'pattern' file # Подсчет вхождений
# Для поиска
find /path -name "*.log" -exec grep "ERROR" {} \;
# Для проверки
test -f /path/file && echo "Exists" || echo "Missing"
Начните с Задачи 1.1 по анализу SSH логов — это реальная задача администратора. Какие результаты у вас получились? Или какая задача вызвала больше всего вопросов?