教程:安全手册(第二部分)

关于教程的注意事项:我们鼓励用户尝试教程,但是我们的团队并不完全支持我们 – 当出现问题时,我们不能总是提供支持。在继续之前,请务必检查其测试的操作系统和版本。如果您遇到问题,请发表评论,我们会尽力帮助。

如果您想要一个完全管理的体验,专门支持您可能想要运行的任何应用程序,请联系我们获取更多信息。

上次,我们开始构建一个更为复杂的可复制的安全手册。我们通过一些简单但合乎逻辑的编辑,使SSH变得更加强硬/etc/ssh/sshd_config,但是我们还可以做更多的工作来改进剧本的即时功能。

如果您还没有看到本教程系列的第一部分,请先跳过该手册,以了解有关Playbook功能的基本结构:教程:安全手册(第二部分)

总而言之,让我们开始吧。

步骤6.创建iptables / tasks / main.yml

使用Ansible 2.0,有一个内置的iptables模块,可以让我们创建规则,而不必依靠运行plain bash命令。这真的很方便,但不是很好的记录,可悲的是。但在我们达成这些规则之前,让我们在铺设基础上进行实地考察。

- name: Install the `iptables` package
 package:
 name: iptables
 state: latest

使用该package模块是现在熟悉的领域 – 我们只是iptables安装的双重检查。

下面开始:

- name: Flush existing firewall rules
 iptables:
 flush: true

我们使用iptables Ansible模块的第一个例子,只是为了刷新可能存在的任何现有规则。

现在,创建规则:

- name: Firewall rule - allow all loopback traffic
 iptables:
 action: append
 chain: INPUT
 in_interface: lo
 jump: ACCEPT

我们首先要允许现在或将来可能在VPS上运行的各种应用程序和服务之间可能存在的任何环回流量。我们现在可以看到我们如何指定chain,可以设置为任何内置的链iptables:“INPUT”,“FORWARD”,“OUTPUT”,“PREROUTING”,“POSTROUTING”,“SECMARK”,“CONNSECMARK ”。该jump参数是我们指定了我们希望与希望的链和我们接口匹配的流量做ACCEPT这个业务,但我们也可以REJECT和DROP它。

为方便起见,我们也希望允许建立连接。

- name: Firewall rule - allow established connections
 iptables:
 chain: INPUT
 ctstate: ESTABLISHED,RELATED
 jump: ACCEPT

这是我们的第一个(也是唯一)的ctstate参数的味道,可以用来创建一些更复杂的规则。

现在,让我们来看看多汁的位 – 允许在某些端口上的特定类型的通信,通常是VPS上想要的。

- name: Firewall rule - allow port ping traffic
 iptables:
 chain: INPUT
 jump: ACCEPT
 protocol: icmp

- name: Firewall rule - allow port 22/SSH traffic
 iptables:
 chain: INPUT
 destination_port: 22
 jump: ACCEPT
 protocol: tcp

- name: Firewall rule - allow port 80/HTTP traffic
 iptables:
 chain: INPUT
 destination_port: 80
 jump: ACCEPT
 protocol: tcp

- name: Firewall rule - allow port 443/HTTPS traffic
 iptables:
 chain: INPUT
 destination_port: 443
 jump: ACCEPT
 protocol: tcp

使用icmp协议的第一个示例允许您ping像往常一样运行您的服务器 – 如果您不允许icmp流量,您的ping将被丢弃或拒绝。

对于其他三个项目,我们只是允许某些目标端口基于人们通常希望在其VPS:端口22上启用的流行服务,用于SSH流量; 端口80,用于HTTP流量; 端口433,用于HTTPS流量。没有这些例外,您会发现许多VPS应用程序将无法正常工作。

现在您已经知道如何根据需要打开端口,您可以根据需要对您的手册进行自定义。

最后,让防火墙有能力做最好的事情:阻止流量。

- name: Firewall rule - drop any traffic without rule
 iptables:
 chain: INPUT
 jump: DROP

与此规则的唯一区别在于使用jump参数DROP,我们只是阻止到达任何端口的流量,并通过任何使用上述规则未打开的协议。您还可以设置jump到REJECT,这将返回关于端口不可达消息。

最后,我们希望在服务器重新启动之间保持这些新规则。这是在Ubuntu和基于Debian的VPS上执行此操作的方法。

- name: Install `netfilter-persistent` && `iptables-persistent` packages
 package:
 name: "{{item}}"
 state: present
 with_items:
 - iptables-persistent
 - netfilter-persistent
 when: ansible_os_family == "Debian"

我们使用相同的旧package模块在这里,结合一个with_items列表,同时安装iptables-persistent和netfilter-persistent。这似乎是在Ubuntu上做的伎俩,因此使用when: ansible_os_family == “Ubuntu”。

步骤7.创建fail2ban / tasks / main.yml

接下来,我们想要快速设置,fail2ban以帮助阻止对我们的服务器的暴力攻击。

- name: Install the `fail2ban` package
 package:
 name: fail2ban
 state: latest

- name: Override some basic fail2ban configurations
 copy:
 src: ../templates/jail.local.j2
 dest: /etc/fail2ban/jail.local
 owner: root
 group: root
 mode: 0644

在这里,我们正在使用该package模块进行安装fail2ban。完成该操作后,我们要为运行建立一些自定义配置fail2ban。为了达到这个目的,我们要复制一个保留在playbook结构内的文件/etc/fail2ban/jail.local。copy除了建立正确的所有权和权限之外,该模块还允许我们做到这一点。

什么是jail.local文件?那么,fail2ban/templates/jail.local.j2在下面创建一个新文件并粘贴到以下内容中:

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true
maxretry = 3

所有这些配置都是确保fail2ban使用iptables,并启用该工具sshd。您可以使用这些设置进行更多操作,您可以通过官方文档进行探索。

第八步奖金!启用无人值守升级

我们快速回到我们的roles/packages/tasks/main.yml文件中配置无人参与的升级,这将有助于使服务器更安全一些。

以下是我们添加到packages角色的内容:

- name: Install the `unattended-upgrades` package
 package:
 name: unattended-upgrades
 state: installed
 when: ansible_os_family == "Debian"

- name: Copy the `20auto-upgrades` configuration file
 copy:
 src: ../templates/20auto-upgrades.j2
 dest: /etc/apt/apt.conf.d/20auto-upgrades
 owner: root
 group: root
 mode: 0644
 when: ansible_os_family == "Debian"

首先,我们正在安装unattended-upgrades,然后复制一个配置文件tasks/packages/templates/20auto-upgrades.j2。那个文件里面有什么?

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

只需要启用该过程所需的准系统选项。同样,此配置可实现自动安全升级,但在这些更新需要时,不会自动重新启动服务器。如果您想要进一步了解其他一些选项,则/etc/apt/apt.conf.d/50unattended-upgrades您的VPS有详细的记录,可以根据您的具体需求进行重新配置。

向前!

该剧本现在是“完成”!自然地,还有更多的可以做到这一点,以改进这个手册的功能,包括更好地支持更多的操作系统选项。在接下来的几个星期里,我将会更新这两个文章,当内置这些支持时,我会根据需要更新这两篇文章。另外还有就是自动安装Docker,记录软件等等。

我把完整的手册放在GitHub上,这样你就可以轻松地看到整个结构,以防万一你一直困惑着。或者,您可以简单地克隆资源库并拥有它。

$ git clone https://github.com/joelhans/ssdnodes-ansible-provision.git

如果您想查看添加的任何功能,或者有关如何将此手册放在一起的问题,请随时通过评论或电子邮件通知我。很高兴在GitHub上采取问题和/或提出请求!