关于教程的注意事项:我们鼓励用户尝试教程,但是我们的团队并不完全支持我们 – 当出现问题时,我们不能总是提供支持。在继续之前,请务必检查其测试的操作系统和版本。如果您遇到问题,请发表评论,我们会尽力帮助。
如果您想要一个完全管理的体验,专门支持您可能想要运行的任何应用程序,请联系我们获取更多信息。
上次,我们开始构建一个更为复杂的可复制的安全手册。我们通过一些简单但合乎逻辑的编辑,使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上采取问题和/或提出请求!