hanru.debianinit
debianinit:Debian 服务器初始化
这个 Ansible 角色配置了一个最小的 Debian 服务器,准备好供未来使用。
当前该角色支持以下发行版:
- Debian Jessie (8.x)
- Debian Stretch (9.x)
- Debian Buster (10.x)
- Debian Bullseye (11.x)
要求
- 远程服务器的 SSH 用户具有 root 权限。
- 远程服务器上安装了 Python。
角色变量
di_ssh_port: 22
SSH 守护进程监听的端口。将 SSH 放在非默认端口上并忽略其他安全措施被认为是安全隐患。
SSH 默认监听 22 端口。建议不要更改此设置。
di_ssh_password_authentication: 'no'
是否启用 SSH 密码认证。
默认情况下密码认证是禁用的。除非有特定的要求,否则不应更改此设置。
di_ssh_permit_root_login: 'without-password'
是否允许 root
用户登录。如果你以 root
身份运行 ansible,那么 without-password
是一个合理的选择。否则,可以安全地设置为 no
。
默认情况下该设置为 without-password
。
di_ssh_allow_users: []
允许通过 SSH 登录的用户列表。空列表意味着不强制该设置。
默认情况下此列表为空,意味着所有用户都被允许。
di_system_removed_packages:
- apache2
- bind9
- rpcbind
- samba
- sendmail
- snmp
要删除(清除)的软件包列表。默认情况下会删除上述某些包。
di_system_installed_packages:
- apt-transport-https
- bzip2
- ca-certificates
- cron
- curl
- dbus
- dnsutils
- haveged
- less
- logrotate
- lsb-release
- mtr-tiny
- openssl
- rsyslog
- screen
- sudo
- time
- vim-tiny
- vnstat
- wget
- whiptail
要安装的软件包列表。默认情况下会安装上述某些包。
di_system_fail2ban_enabled: yes
是否安装 fail2ban,它是一个根据一定规则禁止恶意主机的服务。安装后,暴力 SSH 登录尝试会被自动阻止。
默认情况下会安装 fail2ban。
di_system_timezone: 'UTC'
服务器时区。除非有特定要求,建议使用 UTC
作为默认时区。
di_system_timesync_enabled: yes
是否启用时间同步服务。此服务由 systemd 提供,较轻便于 NTP 服务。在 Xen、KVM 虚拟服务器和专用服务器上应启用此服务。在 OpenVZ 虚拟服务器上,此服务可能无法正常工作。
默认情况下启用此服务。
di_system_unattended_upgrades_enabled: no
是否启用无人值守升级,该升级将自动每日升级系统。请注意,即使启用此功能,服务器仍应进行管理。例如,一些新软件包(特别是新的 Linux 内核)除非重启服务器,否则不会生效。
默认情况下无人值守升级是禁用的。在标准系统上可以安全启用。
di_system_unattended_upgrades_mail_to: ''
一个字符串,表示电子邮件地址。当无人值守升级升级系统或遇到问题时,将向此地址发送电子邮件。
默认情况下此设置为空,意味着不会发送电子邮件。
di_add_users: []
要在服务器上创建的用户列表。每个用户 必须 定义三个字段:name
、password
和 shell
。有关如何定义新用户的更多信息,请参见示例部分。
默认情况下,不创建用户。
di_sudoers_password: []
一份用户列表,能够在提供密码后执行 sudo
命令。
默认情况下不向此列表添加用户。
di_sudoers_passwordless: []
一份用户列表,能够在不提供密码的情况下执行 sudo
。由于 sudo
以 root 身份运行命令,如果不需要密码,安全性本质上受到影响。因此,对于重要服务器,最好将此设置留空。
默认情况下不向此列表添加用户。
di_ufw_enabled: no
是否安装 ufw,一个人性化的 iptables 前端。启用 ufw 后,将设置理智的默认策略(允许出站,拒绝入站),并允许 SSH 端口上的 TCP。如果服务器还有其他用途,例如 HTTP,需要进一步调整 di_ufw_rules
变量,请参见下面的示例剧本。
默认情况下不安装 ufw。
di_ufw_rules:
- { rule: allow, from: any, to: any, port: '{{ di_ssh_port }}', proto: tcp }
用户定义的 ufw 规则列表。启用 ufw 时将应用这些规则。每个规则 必须 有五个字段。
rule
定义规则的类型。可能的值有allow
、deny
和reject
。from
定义源 IP 地址。如果没有源 IP 限制,将from
设置为any
。to
定义目标 IP 地址。如果没有目标 IP 限制,将to
设置为any
。port
定义目标端口。proto
定义网络协议。可能的值有tcp
、udp
和any
。
示例部分展示了如何定义 ufw 规则。请注意,如果需要更改 di_ufw_rules
,则必须保留第一个允许 SSH 端口的规则,否则可能会导致无法访问服务器。此角色仅适用于简单的 ufw 规则。对于更复杂的规则,可能需要手动定义。
默认情况下允许 SSH 端口的 TCP。未定义其他 ufw 规则。
依赖关系
该角色没有依赖关系。
示例剧本
当 root 用户运行剧本时:
- hosts: testservers
vars:
di_add_users:
- name: test
password: randompassword
shell: /bin/bash
- name: git
password: anotherrandompassword
shell: /usr/bin/git-shell
di_ssh_allow_users:
- root
- test
- git
di_sudoers_password:
- test
di_system_unattended_upgrades_enabled: yes
di_system_unattended_upgrades_mail_to: [email protected]
di_ufw_enabled: yes
di_ufw_rules:
- { rule: allow, from: any, to: any, port: '{{ di_ssh_port }}', proto: tcp }
- { rule: allow, from: any, to: any, port: 80, proto: tcp }
- { rule: allow, from: any, to: any, port: 443, proto: tcp }
- { rule: deny, from: 192.168.1.0/24, to: any, port: 53, proto: any }
roles:
- { role: hanru.debianinit }
当具有 sudo 权限的用户运行剧本时:
- hosts: testservers
vars:
...
roles:
- { role: hanru.debianinit, become: yes }
许可证
MIT
参考
该角色受 我第一次在服务器上的 5 分钟 的启发。在开发此角色时,我从以下 Ansible 剧本/角色中学到了很多。