diff --git a/ansible/audit_cryptopro_windows.yml b/ansible/audit_cryptopro_windows.yml
new file mode 100644
index 0000000..e286fb3
--- /dev/null
+++ b/ansible/audit_cryptopro_windows.yml
@@ -0,0 +1,71 @@
+---
+- name: Audit CryptoPro signer readiness on Windows/RDP host
+ hosts: aw_windows
+ gather_facts: false
+
+ vars:
+ aw_windows_deploy_root: "C:\\Program Files\\AWatch-rus"
+ aw_windows_state_root: "C:\\ProgramData\\AWatch-rus"
+ aw_windows_cryptopro_audit_remote_path: "{{ aw_windows_state_root }}\\cryptopro_audit_ansible.json"
+ aw_windows_cryptopro_audit_local_dir: "/tmp/aw-rus-cryptopro-audit-{{ lookup('env','USER') | default('ansible', true) }}"
+ aw_windows_expected_signers:
+ - Администратор
+ - user1
+ - user2
+ - user3
+ - user4
+ - user5
+
+ tasks:
+ - name: Создать каталог toolkit на Windows host
+ ansible.windows.win_file:
+ path: "{{ aw_windows_deploy_root }}\\windows"
+ state: directory
+
+ - name: Загрузить CryptoPro audit script
+ ansible.windows.win_copy:
+ src: "{{ playbook_dir | dirname }}/windows/audit-cryptopro.ps1"
+ dest: "{{ aw_windows_deploy_root }}\\windows\\audit-cryptopro.ps1"
+
+ - name: Нормализовать кодировку PowerShell audit script
+ ansible.windows.win_powershell:
+ script: |
+ $ErrorActionPreference = 'Stop'
+ $path = "{{ aw_windows_deploy_root }}\windows\audit-cryptopro.ps1"
+ $encIn = New-Object System.Text.UTF8Encoding($false)
+ $encOut = New-Object System.Text.UTF8Encoding($true)
+ $text = [System.IO.File]::ReadAllText($path, $encIn)
+ [System.IO.File]::WriteAllText($path, $text, $encOut)
+
+ - name: Выполнить CryptoPro audit и сохранить JSON report
+ ansible.windows.win_powershell:
+ script: |
+ $ErrorActionPreference = 'Stop'
+ $expected = @(
+ {% for user in aw_windows_expected_signers %}
+ "{{ user }}"{% if not loop.last %},{% endif %}
+ {% endfor %}
+ )
+ $report = & "{{ aw_windows_deploy_root }}\windows\audit-cryptopro.ps1" `
+ -ExpectedUsers $expected `
+ -IncludeUnexpectedProfiles
+ $report | ConvertTo-Json -Depth 12 | Out-File -FilePath "{{ aw_windows_cryptopro_audit_remote_path }}" -Encoding utf8
+
+ - name: Создать локальный каталог для CryptoPro audit reports
+ ansible.builtin.file:
+ path: "{{ aw_windows_cryptopro_audit_local_dir }}"
+ state: directory
+ mode: "0755"
+ delegate_to: localhost
+
+ - name: Забрать CryptoPro audit report
+ ansible.builtin.fetch:
+ src: "{{ aw_windows_cryptopro_audit_remote_path }}"
+ dest: "{{ aw_windows_cryptopro_audit_local_dir }}/{{ inventory_hostname }}-cryptopro-audit.json"
+ flat: true
+
+ - name: Показать путь к CryptoPro audit report
+ ansible.builtin.debug:
+ msg:
+ - "CryptoPro audit completed on {{ inventory_hostname }}."
+ - "Report: {{ aw_windows_cryptopro_audit_local_dir }}/{{ inventory_hostname }}-cryptopro-audit.json"
diff --git a/ansible/deploy_aw_server.yml b/ansible/deploy_aw_server.yml
index e7e596f..46f3eb7 100644
--- a/ansible/deploy_aw_server.yml
+++ b/ansible/deploy_aw_server.yml
@@ -63,6 +63,8 @@
- "{{ aw_server_data_dir }}/.config/activitywatch"
- "{{ aw_server_data_dir }}/.config/activitywatch/aw-server-rust"
- "{{ aw_server_data_dir }}/backups"
+ - "{{ aw_rus_health_state_dir }}"
+ - "{{ aw_rus_health_validation_dir }}"
- "{{ aw_server_log_dir }}"
- /etc/activitywatch
- "{{ aw_bootstrap_dir }}"
@@ -88,6 +90,8 @@
- "{{ aw_server_data_dir }}/.config/activitywatch"
- "{{ aw_server_data_dir }}/.config/activitywatch/aw-server-rust"
- "{{ aw_server_data_dir }}/backups"
+ - "{{ aw_rus_health_state_dir }}"
+ - "{{ aw_rus_health_validation_dir }}"
- "{{ aw_server_log_dir }}"
- name: (Check mode) Пропустить установку релиза ActivityWatch
@@ -334,6 +338,10 @@
AW_EXPECT_ALWAYS_ACTIVE_PATTERN={{ aw_server_always_active_pattern | default('') }}
AW_EXPECT_LANDINGPAGE={{ aw_server_landingpage | default('') }}
AW_HEALTH_STRICT_FILEOPS={{ aw_health_strict_fileops | default(0) }}
+ AW_MONITORED_WINDOWS_HOST={{ aw_monitored_windows_host }}
+ AW_MONITORED_WINDOWS_HOSTNAME={{ aw_monitored_windows_hostname }}
+ AW_RUS_HEALTH_STATE_DIR={{ aw_rus_health_state_dir }}
+ AW_RUS_HEALTH_VALIDATION_DIR={{ aw_rus_health_validation_dir }}
- name: Создать каталог DLP policy engine
ansible.builtin.file:
@@ -707,6 +715,14 @@
group: root
mode: "0755"
+ - name: Установить скрипт aw-rus-healthd
+ ansible.builtin.copy:
+ src: "{{ aw_repo_root }}/aw-server/aw-rus-healthd.py"
+ dest: /usr/local/bin/aw-rus-healthd.py
+ owner: root
+ group: root
+ mode: "0755"
+
- name: Установить systemd unit AW worktime UI bridge
ansible.builtin.copy:
src: "{{ aw_repo_root }}/aw-server/aw-worktime-ui-bridge.service"
@@ -739,6 +755,22 @@
group: root
mode: "0644"
+ - name: Установить systemd unit AW-RUS healthd
+ ansible.builtin.copy:
+ src: "{{ aw_repo_root }}/aw-server/aw-rus-healthd.service"
+ dest: /etc/systemd/system/aw-rus-healthd.service
+ owner: root
+ group: root
+ mode: "0644"
+
+ - name: Установить systemd timer AW-RUS healthd
+ ansible.builtin.copy:
+ src: "{{ aw_repo_root }}/aw-server/aw-rus-healthd.timer"
+ dest: /etc/systemd/system/aw-rus-healthd.timer
+ owner: root
+ group: root
+ mode: "0644"
+
- name: Установить systemd unit AW worktime Influx exporter
ansible.builtin.copy:
src: "{{ aw_repo_root }}/aw-server/aw-worktime-influx-exporter.service"
@@ -779,6 +811,12 @@
ansible.builtin.systemd:
daemon_reload: true
+ - name: Включить таймер AW-RUS healthd
+ ansible.builtin.systemd:
+ name: aw-rus-healthd.timer
+ enabled: true
+ state: started
+
- name: Включить и перезапустить DLP policy engine
ansible.builtin.systemd:
name: aw-dlp-policy-engine.service
@@ -1524,31 +1562,21 @@
executable: /bin/bash
changed_when: false
- - name: Post-deploy health gate (aw-health-check)
+ - name: Post-deploy health gate (aw-rus-healthd)
when:
- not ansible_check_mode
- aw_server_post_deploy_health_check_enabled | default(true) | bool
block:
- - name: Запустить /usr/local/bin/aw-health-check
+ - name: Запустить /usr/local/bin/aw-rus-healthd.py --json
ansible.builtin.command:
- cmd: /usr/local/bin/aw-health-check
+ cmd: /usr/local/bin/aw-rus-healthd.py --json
register: aw_post_deploy_health
changed_when: false
- - name: Показать результат aw-health-check
+ - name: Показать результат aw-rus-healthd
ansible.builtin.debug:
msg: "{{ aw_post_deploy_health.stdout }}"
- - name: Запустить /usr/local/bin/dlp-health-check --json
- ansible.builtin.command:
- cmd: /usr/local/bin/dlp-health-check --json
- register: dlp_post_deploy_health
- changed_when: false
-
- - name: Показать результат dlp-health-check
- ansible.builtin.debug:
- msg: "{{ dlp_post_deploy_health.stdout }}"
-
handlers:
- name: Перезагрузить systemd
ansible.builtin.systemd:
diff --git a/ansible/deploy_aw_windows.yml b/ansible/deploy_aw_windows.yml
index c50b6eb..52e924d 100644
--- a/ansible/deploy_aw_windows.yml
+++ b/ansible/deploy_aw_windows.yml
@@ -107,6 +107,7 @@
- deploy-ensemble.ps1
- hardening-recovery.ps1
- rebuild-worktime-tasks.ps1
+ - audit-cryptopro.ps1
- validate-deployment.ps1
- web-category-rules.example.json
- dlp-policy.example.json
diff --git a/ansible/group_vars/all.example.yml b/ansible/group_vars/all.example.yml
index bdac96e..fada2ca 100644
--- a/ansible/group_vars/all.example.yml
+++ b/ansible/group_vars/all.example.yml
@@ -25,6 +25,10 @@ aw_dlp_influx_hosts: "SHARKON2025"
aw_dlp_influx_lookback_days: 30
aw_dlp_influx_event_limit: 2000
aw_dlp_influx_token: ""
+aw_monitored_windows_host: "192.168.100.18"
+aw_monitored_windows_hostname: "SHARKON2025"
+aw_rus_health_state_dir: "{{ aw_server_data_dir }}/health"
+aw_rus_health_validation_dir: "{{ aw_rus_health_state_dir }}/windows-validation"
aw_repo_root: "{{ playbook_dir | dirname }}"
diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index cf62c70..b0362ba 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -23,6 +23,10 @@ aw_dlp_influx_bucket: "aw_metrics"
aw_dlp_influx_hosts: "SHARKON2025"
aw_dlp_influx_lookback_days: 30
aw_dlp_influx_event_limit: 2000
+aw_monitored_windows_host: "192.168.100.18"
+aw_monitored_windows_hostname: "SHARKON2025"
+aw_rus_health_state_dir: "{{ aw_server_data_dir }}/health"
+aw_rus_health_validation_dir: "{{ aw_rus_health_state_dir }}/windows-validation"
aw_repo_root: "/mnt/usb_hdd2/Projects/ActivityWatch-Russian"
diff --git a/ansible/inventory.example.ini b/ansible/inventory.example.ini
index 62669da..8c8b1b0 100644
--- a/ansible/inventory.example.ini
+++ b/ansible/inventory.example.ini
@@ -6,7 +6,7 @@ aw-ct ansible_host=10.20.30.13 ansible_user=root ansible_port=22
[aw_windows]
# Примечание: в русифицированных Windows часто нужен "Администратор", а не "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
+win-node1 ansible_host=192.168.100.18 ansible_user=Администратор ansible_password=CHANGE_ME ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore
[aw_pfsense_pollers]
# pfsense-poller1 ansible_host=192.168.100.30 ansible_user=root ansible_port=22
diff --git a/ansible/inventory.ini b/ansible/inventory.ini
index e883a31..47d8860 100644
--- a/ansible/inventory.ini
+++ b/ansible/inventory.ini
@@ -1,5 +1,8 @@
+[proxmox]
+pve-detmir ansible_host=10.10.10.2 ansible_user=igor ansible_password=04091968 ansible_connection=ssh ansible_become=true ansible_become_method=sudo ansible_become_password=04091968 ansible_port=22
+
[aw_server]
aw-prod ansible_host=10.10.10.13 ansible_user=igor ansible_password=04091968 ansible_connection=ssh ansible_become=true ansible_become_method=sudo ansible_become_password=04091968
[aw_windows]
-rdp-prod ansible_host=192.168.100.21 ansible_user=Администратор ansible_password=Sergei2009@ ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore
+rdp-prod ansible_host=192.168.100.18 ansible_user=Администратор ansible_password=Sergei2009@ ansible_connection=winrm ansible_winrm_transport=ntlm ansible_port=5985 ansible_winrm_server_cert_validation=ignore
diff --git a/aw-server/apply_webui_ru_patch.sh b/aw-server/apply_webui_ru_patch.sh
index 6160cce..343ee06 100755
--- a/aw-server/apply_webui_ru_patch.sh
+++ b/aw-server/apply_webui_ru_patch.sh
@@ -122,15 +122,15 @@ content = re.sub(
)
content = content.replace(
"",
- f'',
+ (
+ f''
+ f''
+ ),
1,
)
content = content.replace(
"