
If you've been following recent security news, you may have heard of the Badlock vulnerability in the protocols used by the Microsoft Windows Active Directory infrastructure. This vulnerability could lead to a man-in-the-middle attacker intercepting traffic between a client and the Active Directory server, and then impersonating the client, gaining unauthorized access to resources.
|
|
More information can be found at http://badlock.org/ and the Red Hat Knowledgebase. |
Thanks to Ansible, however, patching your systems doesn't have to be complicated.
Here’s a sample playbook for Red Hat/Fedora/CentOS and Debian/Ubuntu systems
- hosts: all
gather_facts: true
become_method: sudo
become_user: root
vars:
service_name:
'Debian': 'smbd'
'RedHat': 'smb'
tasks:
- name: check samba version
shell: dpkg -l | grep -q samba
when: ansible_os_family == 'Debian'
register: samba_installed
ignore_errors: True
- name: update samba from apt if installed
apt:
name: samba
state: latest
update_cache: yes
when: ansible_os_family == 'Debian' and samba_installed.rc == 0
notify: restart_samba
- name: check samba version
shell: rpm -q samba
when: ansible_os_family == 'RedHat'
register: samba_installed
ignore_errors: True
- name: update samba from yum if installed
yum:
name: samba
state: latest
update_cache: yes
when: ansible_os_family == 'RedHat' and samba_installed.rc == 0
notify: restart_samba
handlers:
- name: restart_samba
service:
name: "{{ service_name[ansible_os_family] }}"
state: restarted
Note that this version merely installs the latest version of Samba from your vendor. If you know the versions that are vulnerable for your OS or the versions where the fix has been applied, you can create a playbook that tests to make sure you have a correct version. Here’s an example for Red Hat Enterprise Linux systems. (Note: if you’re on a particular EUS or ELS subscription, you may need to adjust the version check. Check the Red Hat Knowledgebase for details.)
- hosts: all
gather_facts: true
become_method: sudo
become_user: root
vars:
vulnerable_releases:
'5': '3.0.33-3.40.el5_10'
'6': '3.6.23-25.el6_7'
'7': '4.2.3-12.el7_2'
vulnerable_3x:
'5': '3.6.23-9.el5_11'
vulnerable_4:
'6': '4.0.0-68.el6_7.rc4'
tasks:
# Base Samba package
- name: check for samba version
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" samba.{{ ansible_architecture }}
register: samba_version
ignore_errors: true
- block:
- name: check for vulnerable versions
debug:
msg: "Samba version {{ samba_version.stdout }} is vulnerable."
when: samba_version.stdout|version_compare(vulnerable_releases[ansible_distribution_major_version], '<=')
register: is_vuln
- name: update samba from yum if vulnerable
yum:
name: samba
state: latest
update_cache: yes
when: not is_vuln|skipped
notify: restart_samba
register: installed
- name: check for samba version
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" samba.{{ ansible_architecture }}
register: samba_new_version
when: not is_vuln|skipped
- name: check that we are no longer vulnerable
debug:
msg: "Samba version {{ samba_new_version.stdout }} is still vulnerable!"
when: not is_vuln|skipped
failed_when: samba_new_version.stdout|version_compare(vulnerable_releases[ansible_distribution_major_version], '<=')
when: samba_version.rc == 0
# Samba 3x package (RHEL 5)
- name: check for samba3x version
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" samba3x.{{ ansible_architecture }}
register: samba3x_version
ignore_errors: True
- block:
- name: check for vulnerable versions
debug:
msg: "Samba3x version {{ samba3x_version.stdout }} is vulnerable."
when: samba3x_version.stdout|version_compare(vulnerable_3x[ansible_distribution_major_version], '<=')
register: is_vuln
- name: update samba3x from yum if vulnerable
yum:
name: samba3x
state: latest
update_cache: yes
when: not is_vuln|skipped
notify: restart_samba
register: installed
- name: check for samba3x version
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" samba3x.{{ ansible_architecture }}
register: samba3x_new_version
when: not is_vuln|skipped
- name: check that we are no longer vulnerable
debug:
msg: "Samba3x version {{ samba3x_new_version.stdout }} is still vulnerable!"
when: not is_vuln|skipped
failed_when: samba3x_new_version.stdout|version_compare(vulnerable_3x[ansible_distribution_major_version], '<=')
when: samba3x_version.rc == 0
# Samba 4x package (RHEL 6)
- name: check for samba4 version
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" samba4.{{ ansible_architecture }}
register: samba4_version
ignore_errors: True
- block:
- name: check for vulnerable versions
debug:
msg: "Samba4 version {{ samba4_version.stdout }} is vulnerable."
when: samba4_version.stdout|version_compare(vulnerable_4[ansible_distribution_major_version], '<=')
register: is_vuln
- name: update samba4 from yum if vulnerable
yum:
name: samba4
state: latest
update_cache: yes
when: not is_vuln|skipped
notify: restart_samba
register: installed
- name: check for samba4 version
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" samba4.{{ ansible_architecture }}
register: samba4_new_version
when: not is_vuln|skipped
- name: check that we are no longer vulnerable
debug:
msg: "Samba4 version {{ samba4_new_version.stdout }} is still vulnerable!"
when: not is_vuln|skipped
failed_when: samba4_new_version.stdout|version_compare(vulnerable_4[ansible_distribution_major_version], '<=')
when: samba4_version.rc == 0
handlers:
- name: restart_samba
service:
name: "{{ service_name[ansible_os_family] }}"
state: restarted
Note that if you have a Red Hat Satellite server in your environment, you’ll need to ensure that your nightly package sync has run and has the latest Samba packages.
But Ansible isn't just for patching your Linux machines. As noted above, this is a cross-platform protocol issue in the protocols used for Active Directory - that means you may need to patch Windows systems as well. With Ansible, that's just a simple playbook as well. In this case, this playbook uses the 'win_reboot' role from Ansible Galaxy.
- hosts: all
gather_facts: true
pre_tasks:
- name: apply security updates
win_updates:
category_names: [u'SecurityUpdates',u'CriticalUpdates']
state: installed
register: updated
roles:
- { role: trondhindenes.win_reboot, when: "updated.reboot_required" }
These playbooks can be found at https://github.com/ansible/ansible-blog-examples.
Want to remediate BADLOCK, but haven't used Ansible before?
Getting started is easy

