Recently, I was tasked to apply CIS Benchmarks to some of my systems. Fortunately, Red Hat has some Ansible roles that make this process almost trivial.

[ Download now: A system administrator's guide to IT automation. ]

One challenge I encountered was with firewalld. One of the controls in the official CIS Ansible roles ensures that firewalld is enabled and running. However, some of my systems didn't have firewalld enabled, by design. This would mean proceeding to deploy the playbooks, which would cause applications to be inaccessible. That would be a huge cost to the organization.

After some research, I found the community.general.listen_ports_facts Ansible module, which made it possible to find all listening TCP and UDP ports. This module is based on the traditional netstat command, which is part of the net-tools package, and the newer ss command. Because I wasn't sure which systems did not have net-tools, I made sure net-tools was installed as part of the process.

My solution

My solution, which is in my Git repository, contains four tasks:

  1. Install or upgrade the net-tools package.
  2. Gather facts on listening ports by loading the listen_ports_facts module.
  3. Add TCP ports listed by the listen_ports_facts to firewalld.
  4. Display the ports added to the server.

Also, the comunity.general collection needs to be installed. If it is not installed, you can install it with:

ansible-galaxy collection install community.general

Here's the playbook:

---
- name: Add Listening TCP port to Firewalld
  hosts: localhost
  gather_facts: true
  become: true
  tasks:
   - name: Install or upgrade the net-tools package
     yum:
       name: net-tools
       state: latest

   - name: tcp ports facts
     listen_ports_facts:

   - name: Add ports to firewall
     firewalld:
       port: "{{ item }}/tcp"
       state: enabled
       immediate: true
       permanent: true
     loop: "{{ ansible_facts.tcp_listen  | map(attribute='port') | sort | list }}"
     register: ports_added_to_firewalld

   - name: print Ports Added
     debug:
       var: ports_added_to_firewalld

I added this playbook to the role, and it solved my issue.

Future improvements

One issue I've discovered is the inability to filter specific ports on each server. Any ideas are welcome as either issues or pull requests to my Git repository. I did have to remove unwanted ports from a few specific servers but, all in all, this made my process much easier!


关于作者

I work as Unix/Linux Administrator with a passion for high availability systems and clusters. I am a student of performance and optimization of systems and DevOps. I have passion for anything IT related and most importantly automation, high availability, and security.

UI_Icon-Red_Hat-Close-A-Black-RGB

按频道浏览

automation icon

自动化

有关技术、团队和环境 IT 自动化的最新信息

AI icon

人工智能

平台更新使客户可以在任何地方运行人工智能工作负载

open hybrid cloud icon

开放混合云

了解我们如何利用混合云构建更灵活的未来

security icon

安全防护

有关我们如何跨环境和技术减少风险的最新信息

edge icon

边缘计算

简化边缘运维的平台更新

Infrastructure icon

基础架构

全球领先企业 Linux 平台的最新动态

application development icon

应用领域

我们针对最严峻的应用挑战的解决方案

Virtualization icon

虚拟化

适用于您的本地或跨云工作负载的企业虚拟化的未来