210 lines
4.5 KiB
YAML
210 lines
4.5 KiB
YAML
---
|
|
- name: Show host IP
|
|
ansible.builtin.debug:
|
|
msg: "{{ ansible_facts['default_ipv4'] }}"
|
|
|
|
|
|
# --- Users & group ---
|
|
|
|
- name: Add group matzman
|
|
ansible.builtin.group:
|
|
name: matzman
|
|
state: present
|
|
gid: 1000
|
|
|
|
- name: Add user matzman
|
|
ansible.builtin.user:
|
|
name: matzman
|
|
uid: 1000
|
|
group: matzman
|
|
create_home: yes
|
|
|
|
|
|
# --- Install required packages ---
|
|
|
|
- name: Update apt cache
|
|
ansible.builtin.apt:
|
|
update_cache: yes
|
|
become: true
|
|
|
|
- name: Upgrade all packages
|
|
ansible.builtin.apt:
|
|
upgrade: dist
|
|
update_cache: yes
|
|
|
|
- name: Check if reboot is required
|
|
ansible.builtin.stat:
|
|
path: /var/run/reboot-required
|
|
register: reboot_required
|
|
|
|
- name: Reboot if required
|
|
ansible.builtin.reboot:
|
|
reboot_timeout: 300
|
|
when: reboot_required.stat.exists
|
|
|
|
- name: Install custom packages
|
|
ansible.builtin.package:
|
|
name:
|
|
# Required by an ansible task later
|
|
- python3-requests
|
|
state: present
|
|
|
|
|
|
# --- Unattended upgrades ---
|
|
|
|
- name: Install unattended-upgrades
|
|
ansible.builtin.package:
|
|
name:
|
|
- unattended-upgrades
|
|
- apt-listchanges
|
|
state: present
|
|
|
|
- name: Enable automatic security upgrades
|
|
ansible.builtin.copy:
|
|
dest: /etc/apt/apt.conf.d/20auto-upgrades
|
|
content: |
|
|
APT::Periodic::Update-Package-Lists "1";
|
|
APT::Periodic::Unattended-Upgrade "1";
|
|
mode: "0644"
|
|
|
|
|
|
# --- SSH setup ---
|
|
|
|
- name: Set authorized key for matzman
|
|
ansible.posix.authorized_key:
|
|
user: matzman
|
|
state: present
|
|
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBi8TS/s2X7W7gb+rGm7A2PG9hRDLa3kYdNM9hLNY0w matzman+2025@matzman.net"
|
|
|
|
- name: Set authorized key for root
|
|
ansible.posix.authorized_key:
|
|
user: root
|
|
state: present
|
|
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBi8TS/s2X7W7gb+rGm7A2PG9hRDLa3kYdNM9hLNY0w matzman+2025@matzman.net"
|
|
|
|
|
|
# --- SSH hardening ---
|
|
|
|
- name: Disable SSH password authentication
|
|
ansible.builtin.lineinfile:
|
|
path: /etc/ssh/sshd_config
|
|
regexp: '^#?PasswordAuthentication'
|
|
line: 'PasswordAuthentication no'
|
|
notify: Restart SSH
|
|
|
|
#- name: Disable SSH root login
|
|
# ansible.builtin.lineinfile:
|
|
# path: /etc/ssh/sshd_config
|
|
# regexp: '^#?PermitRootLogin'
|
|
# line: 'PermitRootLogin no'
|
|
# notify: Restart SSH
|
|
|
|
# --- fail2ban ---
|
|
|
|
- name: Install fail2ban
|
|
ansible.builtin.package:
|
|
name: fail2ban
|
|
state: present
|
|
|
|
- name: Enable and start fail2ban
|
|
ansible.builtin.service:
|
|
name: fail2ban
|
|
state: started
|
|
enabled: yes
|
|
|
|
|
|
# --- Wireguard ---
|
|
|
|
- name: Install wireguard packages
|
|
ansible.builtin.package:
|
|
name:
|
|
- wireguard-tools
|
|
state: present
|
|
|
|
- name: Ensure /etc/wireguard directory exists
|
|
ansible.builtin.file:
|
|
path: /etc/wireguard
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0700"
|
|
tags: wireguard
|
|
|
|
- name: "Deploy {{ wg_if }} config"
|
|
ansible.builtin.template:
|
|
src: "{{ wg_if }}.conf.j2"
|
|
dest: "/etc/wireguard/{{ wg_if }}.conf"
|
|
owner: root
|
|
group: root
|
|
mode: "0600"
|
|
notify: Restart wg0
|
|
tags: wireguard
|
|
|
|
- name: "Enable and start wg-quick@{{ wg_if }}"
|
|
ansible.builtin.systemd:
|
|
name: "wg-quick@{{ wg_if }}"
|
|
enabled: yes
|
|
state: started
|
|
tags: wireguard
|
|
|
|
|
|
# --- Firewall ---
|
|
|
|
- name: Install iptables-persistent
|
|
ansible.builtin.package:
|
|
name:
|
|
- iptables-persistent
|
|
- netfilter-persistent
|
|
state: present
|
|
|
|
- name: Deploy iptables rules (IPv4)
|
|
ansible.builtin.template:
|
|
src: rules.v4.j2
|
|
dest: /etc/iptables/rules.v4
|
|
mode: "0640"
|
|
notify:
|
|
- Reload iptables
|
|
- Restart Docker
|
|
|
|
- name: Deploy iptables rules (IPv6)
|
|
ansible.builtin.template:
|
|
src: rules.v6.j2
|
|
dest: /etc/iptables/rules.v6
|
|
mode: "0640"
|
|
notify:
|
|
- Reload ip6tables
|
|
- Restart Docker
|
|
|
|
# --- sysctl hardening ---
|
|
|
|
- name: Configure sysctl security settings
|
|
ansible.posix.sysctl:
|
|
name: "{{ item.name }}"
|
|
value: "{{ item.value }}"
|
|
state: present
|
|
reload: yes
|
|
loop:
|
|
- { name: 'net.ipv4.conf.all.rp_filter', value: '1' }
|
|
- { name: 'net.ipv4.conf.default.rp_filter', value: '1' }
|
|
- { name: 'net.ipv4.conf.all.accept_redirects', value: '0' }
|
|
- { name: 'net.ipv4.conf.default.accept_redirects', value: '0' }
|
|
- { name: 'net.ipv4.conf.all.send_redirects', value: '0' }
|
|
- { name: 'net.ipv4.conf.default.send_redirects', value: '0' }
|
|
|
|
|
|
# --- Audit logging ---
|
|
|
|
- name: Install auditd
|
|
ansible.builtin.package:
|
|
name: auditd
|
|
state: present
|
|
|
|
- name: Enable and start auditd
|
|
ansible.builtin.service:
|
|
name: auditd
|
|
state: started
|
|
enabled: yes
|
|
|
|
|
|
|