diff --git a/ansible/README.md b/ansible/README.md index b8a82d7..5f1ad9b 100644 --- a/ansible/README.md +++ b/ansible/README.md @@ -66,6 +66,8 @@ ansible-playbook -i inventory.ini provision_proxmox_ct_matrix_and_deploy_aw.yml - `cp /home/igor/tmp/AWatch-rus/ansible/inventory.example.ini /home/igor/tmp/AWatch-rus/ansible/inventory.ini` - `cp /home/igor/tmp/AWatch-rus/ansible/group_vars/windows.example.yml /home/igor/tmp/AWatch-rus/ansible/group_vars/windows.yml` 2. Заполните `inventory.ini` (секция `[aw_windows]`) и `group_vars/windows.yml`. + - Для русской локализации Windows часто нужен `ansible_user=Администратор` (а не `Administrator`). + - Если WinRM закрыт, playbook не сможет стартовать и нужно сначала открыть `5985/5986` и `wsman`. 3. Запустите: ```bash @@ -77,6 +79,8 @@ Playbook: - выгружает `windows/*` toolkit на целевой хост в `C:\Deploy\AWatch-rus\windows`; - выполняет `deploy-ensemble.ps1` (deploy + hardening/recovery) с phase-2 policy/rules; +- после deploy принудительно запускает `ActivityWatch Recovery` и все `ActivityWatch Launch *` задачи; +- выполняет API smoke-check bucket `aw-watcher-afk_SHARKON2025` и ожидает свежие `not-afk` события; - запускает `validate-deployment.ps1`; - забирает JSON-отчёт в локальную директорию (`/tmp/aw-rus-validation` по умолчанию). diff --git a/ansible/deploy_aw_windows_phase2.yml b/ansible/deploy_aw_windows_phase2.yml index 911e3dc..c772f44 100644 --- a/ansible/deploy_aw_windows_phase2.yml +++ b/ansible/deploy_aw_windows_phase2.yml @@ -31,6 +31,12 @@ aw_windows_policy_path: "{{ aw_windows_deploy_root }}\\windows\\dlp-policy.example.json" aw_windows_validation_remote_path: "C:\\Windows\\Temp\\aw_validate_phase2_ansible.json" aw_windows_validation_local_dir: "/tmp/aw-rus-validation" + aw_windows_launch_task_pattern: "ActivityWatch Launch *" + aw_windows_recovery_task_name: "ActivityWatch Recovery" + aw_windows_force_task_restart: true + aw_windows_api_smoke_check_enabled: true + aw_windows_api_smoke_check_bucket: "aw-watcher-afk_SHARKON2025" + aw_windows_api_smoke_check_limit: 10 tasks: - name: Validate required variables @@ -105,6 +111,36 @@ {% endif %} & "{{ aw_windows_deploy_root }}\windows\deploy-ensemble.ps1" @params + - name: Force start ActivityWatch recovery and launch tasks + when: aw_windows_force_task_restart | bool + ansible.windows.win_powershell: + script: | + $ErrorActionPreference = 'Stop' + Start-ScheduledTask -TaskName "{{ aw_windows_recovery_task_name }}" + Get-ScheduledTask | + Where-Object TaskName -like "{{ aw_windows_launch_task_pattern }}" | + ForEach-Object { Start-ScheduledTask -TaskName $_.TaskName } + + - name: Wait for fresh AFK events to appear on AW server + when: aw_windows_api_smoke_check_enabled | bool + delegate_to: localhost + ansible.builtin.uri: + url: "http://{{ aw_windows_server_host }}:{{ aw_windows_server_port }}/api/0/buckets/{{ aw_windows_api_smoke_check_bucket }}/events?limit={{ aw_windows_api_smoke_check_limit }}" + method: GET + return_content: true + register: aw_windows_api_smoke + until: > + aw_windows_api_smoke.status == 200 and + (aw_windows_api_smoke.json | length) > 0 and + ( + aw_windows_api_smoke.json + | selectattr('data.status', 'equalto', 'not-afk') + | list + | length + ) > 0 + retries: 10 + delay: 6 + - name: Run validation and store report on target ansible.windows.win_powershell: script: | diff --git a/ansible/inventory.example.ini b/ansible/inventory.example.ini index f73f446..da44e90 100644 --- a/ansible/inventory.example.ini +++ b/ansible/inventory.example.ini @@ -5,4 +5,5 @@ pve-main ansible_host=192.168.10.2 ansible_user=root ansible_port=22 aw-ct ansible_host=10.20.30.13 ansible_user=root ansible_port=22 [aw_windows] -win-node1 ansible_host=192.168.100.21 ansible_user=Administrator ansible_password=CHANGE_ME ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore +# NOTE: in RU-localized installs this account is often "Администратор" instead of "Administrator". +win-node1 ansible_host=192.168.100.21 ansible_user=Администратор ansible_password=CHANGE_ME ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore diff --git a/docs/runbook.md b/docs/runbook.md index 3d18670..534449c 100755 --- a/docs/runbook.md +++ b/docs/runbook.md @@ -101,6 +101,60 @@ Get-CimInstance Win32_Process | 1. Поставить `incidentCapture.screenshotEnabled = false` в `deployment-config.json` (для каждого StateRoot). 2. Запустить `Start-ScheduledTask -TaskName 'ActivityWatch Recovery'`. +### SHARKON2025: `Активное время = 0s`, хотя `window`-события есть + +Симптом: + +- в Activity view за день видно `Worktime = 0s`; +- `Top Window Titles / Top Categories / Category Tree` пустые; +- при этом bucket `aw-watcher-window_SHARKON2025` содержит свежие события. + +Подтвержденная причина: + +- watcher `afk` "залип" в `status=afk` без `not-afk`; +- из-за этого дневная сводка не считает подтвержденную активность. + +Быстрый recovery (с Linux admin host): + +1. Проверить учетку входа. Для этого кейса рабочая учетная запись: `SHARKON2025\Администратор` (не `Administrator`). +2. Поднять remote execution через `wmiexec.py` с auth-file: + +```sh +cat > /tmp/sharkon_ru.auth << 'EOF' +username = Администратор +password = +domain = SHARKON2025 +EOF +chmod 600 /tmp/sharkon_ru.auth +``` + +3. Запустить recovery task: + +```sh +wmiexec.py -nooutput -A /tmp/sharkon_ru.auth 192.168.100.21 \ + "powershell -NoProfile -Command \"Start-ScheduledTask -TaskName 'ActivityWatch Recovery'\"" +``` + +4. Запустить все launch tasks: + +```sh +wmiexec.py -nooutput -A /tmp/sharkon_ru.auth 192.168.100.21 \ + "powershell -NoProfile -Command \"Get-ScheduledTask | Where-Object TaskName -like 'ActivityWatch Launch *' | ForEach-Object { Start-ScheduledTask -TaskName \$_.TaskName }\"" +``` + +5. Подождать 10-20 секунд и проверить API на AW server (`10.10.10.13:5600`): + +```sh +curl -fsS 'http://10.10.10.13:5600/api/0/buckets/aw-watcher-afk_SHARKON2025/events?limit=30' \ + | jq '{latest:.[0].timestamp, statuses:(group_by(.data.status)|map({status:.[0].data.status,count:length}))}' +``` + +Ожидаемо после фикса: + +- в свежих AFK-событиях появляется `status=not-afk`; +- `aw-watcher-window_SHARKON2025` продолжает обновляться; +- после обновления страницы UI дневная сводка перестает быть `0s`. + ### Сервис не стартует ```sh