Практика: от основ к реальным задачам

Пример 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. Составьте план действий по результатам аудита

💡 Советы для эффективной практики:

  1. Создайте тестовую среду в VirtualBox или используйте WSL2
  2. Ломайте систему нарочно, потом чините — лучший способ научиться
  3. Документируйте все команды, которые используете
  4. Автоматизируйте повторяющиеся задачи сразу
  5. Читайте логи — они расскажут всё о системе

Ключевые команды для запоминания:

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 логов — это реальная задача администратора. Какие результаты у вас получились? Или какая задача вызвала больше всего вопросов?

Оставьте комментарий