Compare commits

..
4 Commits
Author SHA1 Message Date
Sebastian Gumprich d14b24303d use tests with -G instead of extended so sshd does not need to run
Signed-off-by: Sebastian Gumprich <[email protected]>
2024-05-27 15:39:18 +02:00
Sebastian Gumprich 13c40f66ad use tests with -G instead of extended so sshd does not need to run
Signed-off-by: Sebastian Gumprich <[email protected]>
2024-05-27 15:35:13 +02:00
Sebastian Gumprich 5739b6861b use normal tests without -C instead of extended so sshd does not need to run
Signed-off-by: Sebastian Gumprich <[email protected]>
2024-05-27 15:29:00 +02:00
Sebastian Gumprich b9475287a4 use normal tests instead of extended so sshd does not need to run
Signed-off-by: Sebastian Gumprich <[email protected]>
2024-05-27 15:21:57 +02:00
121 changed files with 926 additions and 1386 deletions

No files matched your search

-1
View File
@@ -43,7 +43,6 @@ output_template: |
```
- hosts: all
become: true
roles:
- name: {{ role }}
```
+4 -2
View File
@@ -5,10 +5,12 @@
# option will be parsed relative to the CWD of execution.
exclude_paths:
- .cache/ # implicit unless exclude_paths is defined in config
- .ansible/ # somehow someone decided that the cache directory should be renamed
# add all waivers individually, since exclude_files does not support globs
- molecule/os_hardening/waivers.yaml
- molecule/ssh_hardening_vm/waivers_*.yaml
- molecule/ssh_hardening_bsd/waivers_freebsd12.yaml
- molecule/ssh_hardening_bsd/waivers_freebsd13.yaml
- molecule/ssh_hardening_bsd/waivers_freebsd14.yaml
- molecule/ssh_hardening_bsd/waivers_openbsd7.yaml
mock_roles:
- geerlingguy.git
-3
View File
@@ -1,3 +0,0 @@
major-labels: ['major']
minor-labels: ['minor', 'enhancement']
patch-labels: ['patch', 'bug']
+3 -3
View File
@@ -23,10 +23,10 @@ on: # yamllint disable-line rule:truthy
jobs:
ansible-lint:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@v4
- name: Lint Ansible Playbook
uses: ansible/ansible-lint@5fac056c45595896c973fbde871f01f6cb14d74c # v26
uses: ansible/ansible-lint@v24
+2 -2
View File
@@ -9,6 +9,6 @@ on: # yamllint disable-line rule:truthy
jobs:
codespell:
uses: "dev-sec/.github/.github/workflows/codespell.yml@2cd00282cfdb322243d879a96d9494ce64e76119" # main
uses: "dev-sec/.github/.github/workflows/codespell.yml@main"
with:
ignore_words_list: "chage,BOOTUP"
ignore_words_list: "chage"
+2 -2
View File
@@ -12,8 +12,8 @@ permissions:
jobs:
enforce-label:
if: github.repository == 'dev-sec/ansible-collection-hardening'
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@f27b608878404679385c85cfa523b85ccb86e213 # v6.1.0
- uses: actions/labeler@v5.0.0
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
+6 -6
View File
@@ -9,32 +9,32 @@ on: # yamllint disable-line rule:truthy
jobs:
deploy:
if: github.repository == 'dev-sec/ansible-collection-hardening'
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@v4
# deploy the collection first, because if it fails, we don't want
# to update the galaxy.yml
- name: Deploy the collection
uses: artis3n/ansible_galaxy_collection@ffbca2460a5a1c600b941bbf1536bd61de1c2227 # v3
uses: artis3n/ansible_galaxy_collection@v2
with:
api_key: ${{ secrets.GALAXY_API_KEY }}
galaxy_version: ${{ github.event.release.tag_name }}
# checkout master instead of the release-tag so we can push the galaxy.yml
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@v4
with:
ref: master
- name: update galaxy.yml with new version
uses: microsoft/variable-substitution@6287962da9e5b6e68778dc51e840caa03ca84495 # v1
uses: microsoft/variable-substitution@v1
with:
files: 'galaxy.yml'
env:
version: "${{ github.event.release.tag_name }}"
- name: push galaxy.yml
uses: github-actions-x/commit@722d56b8968bf00ced78407bbe2ead81062d8baa # v2.9
uses: github-actions-x/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
push-branch: 'master'
+15 -21
View File
@@ -29,7 +29,7 @@ concurrency:
jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -37,47 +37,39 @@ jobs:
fail-fast: false
matrix:
molecule_distro:
- almalinux8
- almalinux9
# - almalinux10 # problem with baseline
- centos7
- centosstream8
- centosstream9
- rocky8
- rocky9
# - rocky10 # problem with baseline
- ubuntu1804
- ubuntu2004
- ubuntu2204
- ubuntu2404
# - ubuntu2604 # problem with test setup
- debian10
- debian11
- debian12
- debian13
# - amazon # geerlingguy.mysql does not support fedora
# - arch # geerlingguy.mysql does not support arch
- opensuse_tumbleweed
# - fedora # geerlingguy.mysql does not support fedora
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v5
with:
python-version: 3.13
cache: 'pip'
python-version: 3.12
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Downgrade Ansible for Rocky 8 tests
run: |
pip install "ansible-core<2.17"
ansible-galaxy collection install 'community.crypto:<3.0.0'
ansible-galaxy collection install 'community.general:<12.0.0'
sudo apt install git
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
if: matrix.molecule_distro == 'rocky8' || matrix.molecule_distro == 'almalinux8'
# that was a hard one to fix. robert did it thankfully
# https://github.com/robertdebock/ansible-role-mysql/commit/7562e99099b06282391ab7ed102b393a0406d212
@@ -101,7 +93,9 @@ jobs:
/home/runner/.ansible/roles
- name: Test with molecule
run: molecule test -s mysql_hardening
run: |
molecule --version
molecule test -s mysql_hardening
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
working-directory: ansible_collections/devsec/hardening
+15 -21
View File
@@ -28,7 +28,7 @@ concurrency:
jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -36,47 +36,39 @@ jobs:
fail-fast: false
matrix:
molecule_distro:
- almalinux8
- almalinux9
- almalinux10
- centos7
- centosstream8
- centosstream9
- rocky8
- rocky9
- rocky10
- ubuntu1804
- ubuntu2004
- ubuntu2204
- ubuntu2404
- ubuntu2604
- debian10
- debian11
- debian12
- debian13
- amazon2023
# - arch # needs to be fixed
# - opensuse_tumbleweed # needs to be fixed
# - fedora # no support from geerlingguy role
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v5
with:
python-version: 3.13
cache: 'pip'
python-version: 3.12
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Downgrade Ansible for Rocky 8 tests
run: |
pip install "ansible-core<2.17"
ansible-galaxy collection install 'community.crypto:<3.0.0'
ansible-galaxy collection install 'community.general:<12.0.0'
sudo apt install git
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
if: matrix.molecule_distro == 'rocky8' || matrix.molecule_distro == 'almalinux8'
# Molecule has problems detecting the proper location for installing roles
# https://github.com/ansible/molecule/issues/3806
@@ -90,7 +82,9 @@ jobs:
/home/runner/.ansible/roles
- name: Test with molecule
run: molecule test -s nginx_hardening
run: |
molecule --version
molecule test -s nginx_hardening
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
working-directory: ansible_collections/devsec/hardening
+21 -30
View File
@@ -28,65 +28,56 @@ concurrency:
jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
strategy:
fail-fast: false
matrix:
include:
- molecule_distro: opensuse_tumbleweed
molecule_docker_command: "/usr/lib/systemd/systemd"
molecule_distro:
- almalinux8
- almalinux9
- almalinux10
- centos7
- centosstream8
- centosstream9
- rocky8
- rocky9
- rocky10
- fedora42
- fedora43
- fedora44
- fedora38
- fedora39
- ubuntu1804
- ubuntu2004
- ubuntu2204
- ubuntu2404
- ubuntu2604
- debian10
- debian11
- debian12
- debian13
- amazon2023
- opensuse_tumbleweed
- arch
molecule_docker_command:
- "/lib/systemd/systemd"
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v5
with:
python-version: 3.13
cache: 'pip'
python-version: 3.12
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Downgrade Ansible for Rocky 8 tests
run: |
pip install "ansible-core<2.17"
ansible-galaxy collection install 'community.crypto:<3.0.0'
ansible-galaxy collection install 'community.general:<12.0.0'
sudo apt install git
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
if: matrix.molecule_distro == 'rocky8' || matrix.molecule_distro == 'almalinux8'
- name: Test with molecule
run: molecule test -s os_hardening
run: |
if [ "$MOLECULE_DISTRO" = "opensuse_tumbleweed" ]; then
export MOLECULE_DOCKER_COMMAND="/usr/lib/systemd/systemd"
fi
molecule --version
molecule test -s os_hardening
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
MOLECULE_DOCKER_COMMAND: ${{ matrix.molecule_docker_command }}
working-directory: ansible_collections/devsec/hardening
+9 -34
View File
@@ -9,7 +9,6 @@ on: # yamllint disable-line rule:truthy
- 'molecule/os_hardening_vm/**'
- '.github/workflows/os_hardening_vm.yml'
- 'requirements.txt'
- 'requirements-vm.txt'
pull_request:
branches: [master]
paths:
@@ -17,7 +16,6 @@ on: # yamllint disable-line rule:truthy
- 'molecule/os_hardening_vm/**'
- '.github/workflows/os_hardening_vm.yml'
- 'requirements.txt'
- 'requirements-vm.txt'
schedule:
- cron: '0 6 * * 2'
@@ -38,58 +36,35 @@ jobs:
fail-fast: false
matrix:
molecule_distro:
- almalinux/8
- almalinux/9
# - almalinux/10 # boot loop
- generic/centos7
- generic/centos8s
- generic/centos9s
- generic/rocky8
- generic/rocky9
- alvistack/fedora-42
# - alvistack/fedora-43 # no compatible test image
- fedora/38-cloud-base
- fedora/39-cloud-base
- generic/ubuntu1804
- generic/ubuntu2004
- generic/ubuntu2204
- alvistack/ubuntu-24.04
# - alvistack/ubuntu-26.04 # no compatible test image
- generic/debian10
- generic/debian11
- generic/debian12
- cloud-image/debian-13
- generic/opensuse15
- generic/arch
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Install dependencies
run: |
source ~/.venv/ansible-collection-hardening/bin/activate
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
pip install -r requirements-vm.txt
working-directory: ansible_collections/devsec/hardening
- name: Downgrade Ansible for Rocky 8 tests
run: |
source ~/.venv/ansible-collection-hardening/bin/activate
pip install "ansible-core<2.17"
ansible-galaxy collection install 'community.crypto:<3.0.0'
ansible-galaxy collection install 'community.general:<12.0.0'
working-directory: ansible_collections/devsec/hardening
if: >
matrix.molecule_distro == 'generic/rocky8' ||
matrix.molecule_distro == 'almalinux/8' ||
matrix.molecule_distro == 'generic/opensuse15'
- name: Update Vagrant Box
run: |
vagrant box update --box ${{ matrix.molecule_distro }} || true
- name: Test with molecule
run: |
source ~/.venv/ansible-collection-hardening/bin/activate
# Workaround for https://github.com/ansible-community/molecule-plugins/issues/301
export MOLECULE_VAGRANT_PLUGIN_DIR=$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/molecule_plugins/vagrant
molecule --version
molecule test -s os_hardening_vm
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
+3 -3
View File
@@ -11,16 +11,16 @@ on: # yamllint disable-line rule:truthy
jobs:
prettier-md:
if: github.repository == 'dev-sec/ansible-collection-hardening'
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Git checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- name: Prettify code
uses: creyD/prettier_action@8c18391fdc98ed0d884c6345f03975edac71b8f0 # v4.6
uses: creyD/prettier_action@v4.3
with:
prettier_options: --write {**/*,*}.md
+10 -10
View File
@@ -11,38 +11,38 @@ jobs:
generate_changelog:
name: create release draft
if: github.repository == 'dev-sec/ansible-collection-hardening'
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: master
- name: 'Get Previous tag'
id: previoustag
uses: "WyriHaximus/github-action-get-previous-tag@61819f33034117e6c686e6a31dba995a85afc9de" # master
uses: "WyriHaximus/github-action-get-previous-tag@master"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
- name: calculate next version
id: version
uses: patrickjahns/version-drafter-action@2076fa43abb28f31d0e8b0890253fbd1d1a966fc # v1
uses: patrickjahns/version-drafter-action@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Generate changelog
uses: charmixer/auto-changelog-action@b25e89c9410e03189f0d48b02b3a8caad6e78015 # v1
uses: charmixer/auto-changelog-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
future_release: ${{ steps.version.outputs.next-version }}
# this excludes all versions prior to the collection-release
# since they break the changelog generation with the error:
# "No common ancestor between ... and $version"
exclude_tags_regex: '^[0-6]\.\d\.\d'
exclude_tags_regex: '[0-6]\.\d\.\d'
issue_line_labels: mysql_hardening,os_hardening,ssh_hardening,nginx_hardening
- name: push changelog
uses: github-actions-x/commit@722d56b8968bf00ced78407bbe2ead81062d8baa # v2.9
uses: github-actions-x/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
push-branch: 'master'
@@ -58,18 +58,18 @@ jobs:
- name: Read CHANGELOG.md
id: package
uses: juliangruber/read-file-action@271ff311a4947af354c6abcd696a306553b9ec18 # v1
uses: juliangruber/read-file-action@v1
with:
path: ./CHANGELOGRELEASE.md
- name: Delete old drafts
uses: hugo19941994/delete-draft-releases@3f19a25abf2ce87850c2268938f98f14e4d3d1f1 # v3.0.0
uses: hugo19941994/delete-draft-releases@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create Release draft
id: create_release
uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e # v1
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
with:
+9 -13
View File
@@ -6,18 +6,15 @@ on: # yamllint disable-line rule:truthy
branches: [master]
paths:
- 'roles/**/meta/argument_specs.yml'
- 'roles/**/meta/main.yml'
pull_request:
branches: [master]
paths:
- 'roles/**/meta/argument_specs.yml'
- 'roles/**/meta/main.yml'
- 'requirements.txt'
jobs:
readme:
name: create roles readme
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
strategy:
matrix:
roles:
@@ -27,26 +24,25 @@ jobs:
- ssh_hardening
steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v5
with:
python-version: 3.13
cache: 'pip'
python-version: 3.12
- name: Install dependencies
run: pip install -r requirements.txt
- name: Install aar_doc
run: pip3 install aar_doc
- name: Run aar-doc
run: aar-doc roles/${{ matrix.roles }} markdown
- name: Run aar_doc
run: aar_doc roles/${{ matrix.roles }} markdown
- name: Output diff
run: git diff roles/${{ matrix.roles }}/README.md
- name: Push README
if: github.event_name != 'pull_request'
uses: github-actions-x/commit@722d56b8968bf00ced78407bbe2ead81062d8baa # v2.9
uses: github-actions-x/[email protected]
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
commit-message: 'update ${{ matrix.roles }} readme'
+21 -33
View File
@@ -28,68 +28,56 @@ concurrency:
jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
strategy:
fail-fast: false
matrix:
include:
# needs fix - opensuse has different file location for conf and pam (/usr/etc/ssh/?, /usr/lib/pam.d/?)
# - molecule_distro: opensuse_tumbleweed
# molecule_docker_command: "/usr/lib/systemd/systemd"
- molecule_distro: alpine
molecule_docker_command: "/sbin/init"
molecule_distro:
- almalinux8
- almalinux9
- almalinux10
- centos7
- centosstream8
- centosstream9
- rocky8
- rocky9
- rocky10
- fedora42
- fedora43
- fedora44
- fedora38
- fedora39
- ubuntu1804
- ubuntu2004
- ubuntu2204
- ubuntu2404
- ubuntu2604
- debian10
- debian11
- debian12
- debian13
- amazon2023
- arch
molecule_docker_command:
- "/lib/systemd/systemd"
# - opensuse_tumbleweed # needs fix - opensuse has different file location for conf and pam (/usr/etc/ssh/?, /usr/lib/pam.d/?)
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v5
with:
python-version: 3.13
cache: 'pip'
python-version: 3.12
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Downgrade Ansible for Rocky 8 tests
run: |
pip install "ansible-core<2.17"
ansible-galaxy collection install 'community.crypto:<3.0.0'
ansible-galaxy collection install 'community.general:<12.0.0'
sudo apt install git
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
if: matrix.molecule_distro == 'rocky8' || matrix.molecule_distro == 'almalinux8'
- name: Test with molecule
run: molecule test -s ssh_hardening
run: |
if [ "$MOLECULE_DISTRO" = "opensuse_tumbleweed" ]; then
export MOLECULE_DOCKER_COMMAND="/usr/lib/systemd/systemd"
fi
molecule --version
molecule test -s ssh_hardening
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
MOLECULE_DOCKER_COMMAND: ${{ matrix.molecule_docker_command }}
working-directory: ansible_collections/devsec/hardening
+60
View File
@@ -0,0 +1,60 @@
---
name: "devsec.ssh_hardening BSD"
on: # yamllint disable-line rule:truthy
workflow_dispatch:
push:
branches: [master]
paths:
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_bsd/**'
- '.github/workflows/ssh_hardening_bsd.yml'
- 'requirements.txt'
pull_request:
branches: [master]
paths:
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_bsd/**'
- '.github/workflows/ssh_hardening_bsd.yml'
- 'requirements.txt'
schedule:
- cron: '0 6 * * 5'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: self-hosted
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
strategy:
fail-fast: false
matrix:
molecule_distro:
- openbsd7
- freebsd12
- freebsd13
- freebsd14
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Update Vagrant Box
run: |
vagrant box update --box generic/${{ matrix.molecule_distro }} || true
- name: Test with molecule
run: |
molecule --version
molecule test -s ssh_hardening_bsd
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
working-directory: ansible_collections/devsec/hardening
@@ -28,68 +28,56 @@ concurrency:
jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
strategy:
fail-fast: false
matrix:
include:
# needs fix - opensuse has different file location for conf and pam (/usr/etc/ssh/?, /usr/lib/pam.d/?)
# - molecule_distro: opensuse_tumbleweed
# molecule_docker_command: "/usr/lib/systemd/systemd"
- molecule_distro: alpine
molecule_docker_command: "/sbin/init"
molecule_distro:
- almalinux8
- almalinux9
- almalinux10
- centos7
- centosstream8
- centosstream9
- rocky8
- rocky9
- rocky10
- fedora42
- fedora43
- fedora44
- fedora38
- fedora39
- ubuntu1804
- ubuntu2004
- ubuntu2204
- ubuntu2404
- ubuntu2604
- debian10
- debian11
- debian12
- debian13
- amazon2023
- arch
molecule_docker_command:
- "/lib/systemd/systemd"
# - opensuse_tumbleweed # needs fix - opensuse has different file location for conf and pam (/usr/etc/ssh/?, /usr/lib/pam.d/?)
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
uses: actions/checkout@v4
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v5
with:
python-version: 3.13
cache: 'pip'
python-version: 3.12
- name: Install dependencies
run: pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Downgrade Ansible for Rocky 8 tests
run: |
pip install "ansible-core<2.17"
ansible-galaxy collection install 'community.crypto:<3.0.0'
ansible-galaxy collection install 'community.general:<12.0.0'
sudo apt install git
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
if: matrix.molecule_distro == 'rocky8' || matrix.molecule_distro == 'almalinux8'
- name: Test with molecule
run: molecule test -s ssh_hardening_custom_tests
run: |
if [ "$MOLECULE_DISTRO" = "opensuse_tumbleweed" ]; then
export MOLECULE_DOCKER_COMMAND="/usr/lib/systemd/systemd"
fi
molecule --version
molecule converge -s ssh_hardening_custom_tests
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
MOLECULE_DOCKER_COMMAND: ${{ matrix.molecule_docker_command }}
working-directory: ansible_collections/devsec/hardening
-73
View File
@@ -1,73 +0,0 @@
---
name: "devsec.ssh_hardening VM"
on: # yamllint disable-line rule:truthy
workflow_dispatch:
push:
branches: [master]
paths:
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_vm/**'
- '.github/workflows/ssh_hardening_vm.yml'
- 'requirements.txt'
- 'requirements-vm.txt'
pull_request:
branches: [master]
paths:
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_vm/**'
- '.github/workflows/ssh_hardening_vm.yml'
- 'requirements.txt'
- 'requirements-vm.txt'
schedule:
- cron: '0 6 * * 5'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: self-hosted
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
strategy:
fail-fast: false
matrix:
molecule_distro:
- generic/openbsd7
- generic/freebsd14
- cloud-image/debian-13
- cloud-image/ubuntu-24.04
- cloud-image/ubuntu-26.04
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Install dependencies
run: |
source ~/.venv/ansible-collection-hardening/bin/activate
python -m pip install --no-cache-dir --upgrade pip
pip install -r requirements.txt
pip install -r requirements-vm.txt
working-directory: ansible_collections/devsec/hardening
- name: Update Vagrant Box
run: |
vagrant box update --box ${{ matrix.molecule_distro }} || true
- name: Test with molecule
run: |
source ~/.venv/ansible-collection-hardening/bin/activate
# Workaround for https://github.com/ansible-community/molecule-plugins/issues/301
export MOLECULE_VAGRANT_PLUGIN_DIR=$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')/molecule_plugins/vagrant
molecule test -s ssh_hardening_vm
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
working-directory: ansible_collections/devsec/hardening
+6 -254
View File
@@ -1,275 +1,25 @@
# Changelog
## [10.6.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.6.0) (2026-05-13)
## [9.0.2](https://github.com/dev-sec/ansible-collection-hardening/tree/9.0.2) (2024-05-09)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.5.2...10.6.0)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/9.0.1...9.0.2)
**Implemented enhancements:**
- Update APT package cache before installing any package in case freshly installed system. [\#945](https://github.com/dev-sec/ansible-collection-hardening/issues/945)
- Update supported OS versions to current Fedora \(42/43/44\) and Ubuntu \(22.04/24.04/26.04\) [\#946](https://github.com/dev-sec/ansible-collection-hardening/pull/946) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
**Merged pull requests:**
- Update actions/labeler action to v6.1.0 [\#947](https://github.com/dev-sec/ansible-collection-hardening/pull/947) ([renovate[bot]](https://github.com/apps/renovate))
- Update dev-sec/.github digest to 2cd0028 [\#943](https://github.com/dev-sec/ansible-collection-hardening/pull/943) ([renovate[bot]](https://github.com/apps/renovate))
- Update ansible/ansible-lint digest to 5fac056 [\#942](https://github.com/dev-sec/ansible-collection-hardening/pull/942) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency molecule to v26 [\#935](https://github.com/dev-sec/ansible-collection-hardening/pull/935) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ansible-core to v2.20.5 [\#910](https://github.com/dev-sec/ansible-collection-hardening/pull/910) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
## [10.5.2](https://github.com/dev-sec/ansible-collection-hardening/tree/10.5.2) (2026-03-28)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.5.1...10.5.2)
**Fixed bugs:**
- do not update apt cache when installing libpam-passwdqc [\#939](https://github.com/dev-sec/ansible-collection-hardening/pull/939) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([eikesauer](https://github.com/eikesauer))
**Merged pull requests:**
- chore\(deps\): update hugo19941994/delete-draft-releases action to v3 [\#940](https://github.com/dev-sec/ansible-collection-hardening/pull/940) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): pin dependencies [\#938](https://github.com/dev-sec/ansible-collection-hardening/pull/938) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/checkout digest to de0fac2 [\#932](https://github.com/dev-sec/ansible-collection-hardening/pull/932) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
## [10.5.1](https://github.com/dev-sec/ansible-collection-hardening/tree/10.5.1) (2026-03-20)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.5.0...10.5.1)
**Fixed bugs:**
- fix flaky failures on Ubuntu 24.04 and newer by disabling sshd socket activation first [\#931](https://github.com/dev-sec/ansible-collection-hardening/pull/931) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([kuglimon](https://github.com/kuglimon))
**Closed issues:**
- SSH issue after running devsec.hardening.ssh\_hardening role [\#854](https://github.com/dev-sec/ansible-collection-hardening/issues/854)
**Merged pull requests:**
- chore\(deps\): update juliangruber/read-file-action digest to 271ff31 [\#937](https://github.com/dev-sec/ansible-collection-hardening/pull/937) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 8ba9595 [\#934](https://github.com/dev-sec/ansible-collection-hardening/pull/934) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update artis3n/ansible\_galaxy\_collection action to v3 [\#933](https://github.com/dev-sec/ansible-collection-hardening/pull/933) ([renovate[bot]](https://github.com/apps/renovate))
- Improve VM based testing of SSH hardening [\#878](https://github.com/dev-sec/ansible-collection-hardening/pull/878) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
## [10.5.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.5.0) (2026-01-22)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.4.0...10.5.0)
**Implemented enhancements:**
- fix: replace deprecated community.general.yaml callback plugin [\#918](https://github.com/dev-sec/ansible-collection-hardening/pull/918) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([Normo](https://github.com/Normo))
- Consistently access facts via the ansible\_facts.\* namespace [\#917](https://github.com/dev-sec/ansible-collection-hardening/pull/917) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([Normo](https://github.com/Normo))
- disable systemd audit logging [\#902](https://github.com/dev-sec/ansible-collection-hardening/pull/902) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([z-bsod](https://github.com/z-bsod))
**Fixed bugs:**
- /etc/sysctl.conf is no longer honored in Debian 13 [\#905](https://github.com/dev-sec/ansible-collection-hardening/issues/905)
**Merged pull requests:**
- chore\(deps\): update dependency jmespath to v1.1.0 [\#930](https://github.com/dev-sec/ansible-collection-hardening/pull/930) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/setup-python digest to a309ff8 [\#929](https://github.com/dev-sec/ansible-collection-hardening/pull/929) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint action to v26 [\#928](https://github.com/dev-sec/ansible-collection-hardening/pull/928) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update artis3n/ansible\_galaxy\_collection digest to 415a92b - autoclosed [\#927](https://github.com/dev-sec/ansible-collection-hardening/pull/927) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to a2bc8b8 [\#924](https://github.com/dev-sec/ansible-collection-hardening/pull/924) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/setup-python digest to 83679a8 [\#920](https://github.com/dev-sec/ansible-collection-hardening/pull/920) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/checkout action to v6 [\#919](https://github.com/dev-sec/ansible-collection-hardening/pull/919) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency molecule to v25.12.0 [\#914](https://github.com/dev-sec/ansible-collection-hardening/pull/914) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 40f24c2 [\#913](https://github.com/dev-sec/ansible-collection-hardening/pull/913) ([renovate[bot]](https://github.com/apps/renovate))
- Update test environments to current Ansible version [\#909](https://github.com/dev-sec/ansible-collection-hardening/pull/909) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): update ansible/ansible-lint digest to d7cd7cf [\#903](https://github.com/dev-sec/ansible-collection-hardening/pull/903) ([renovate[bot]](https://github.com/apps/renovate))
## [10.4.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.4.0) (2025-10-22)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.3.1...10.4.0)
**Implemented enhancements:**
- Support Debian 13 [\#891](https://github.com/dev-sec/ansible-collection-hardening/issues/891)
- Support EL10 [\#870](https://github.com/dev-sec/ansible-collection-hardening/issues/870)
- Add support for current versions of Debian and EL [\#893](https://github.com/dev-sec/ansible-collection-hardening/pull/893) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- Add SSH config for EL/AlmaLinux 10 [\#888](https://github.com/dev-sec/ansible-collection-hardening/pull/888) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([jonathanspw](https://github.com/jonathanspw))
**Fixed bugs:**
- Write sysctl config to separate file [\#907](https://github.com/dev-sec/ansible-collection-hardening/pull/907) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
**Closed issues:**
- sysctl-34 - fs.protected\_regular not set [\#536](https://github.com/dev-sec/ansible-collection-hardening/issues/536)
**Merged pull requests:**
- Update ArchLinux test environment before testing [\#908](https://github.com/dev-sec/ansible-collection-hardening/pull/908) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): update actions/setup-python action to v6 [\#901](https://github.com/dev-sec/ansible-collection-hardening/pull/901) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/labeler action to v6 [\#900](https://github.com/dev-sec/ansible-collection-hardening/pull/900) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 8861a73 [\#899](https://github.com/dev-sec/ansible-collection-hardening/pull/899) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/checkout action to v5 [\#895](https://github.com/dev-sec/ansible-collection-hardening/pull/895) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency python to 3.13 [\#892](https://github.com/dev-sec/ansible-collection-hardening/pull/892) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency aar-doc to v2.3.0 [\#890](https://github.com/dev-sec/ansible-collection-hardening/pull/890) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 9765b87 [\#889](https://github.com/dev-sec/ansible-collection-hardening/pull/889) ([renovate[bot]](https://github.com/apps/renovate))
- Improve OS support accuracy [\#887](https://github.com/dev-sec/ansible-collection-hardening/pull/887) ([jonathanspw](https://github.com/jonathanspw))
- chore\(deps\): update hugo19941994/delete-draft-releases action to v2 [\#885](https://github.com/dev-sec/ansible-collection-hardening/pull/885) ([renovate[bot]](https://github.com/apps/renovate))
## [10.3.1](https://github.com/dev-sec/ansible-collection-hardening/tree/10.3.1) (2025-07-24)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.3.0...10.3.1)
**Fixed bugs:**
- Readme states Ansible \>= 2.9.10, but it uses password\_expire\_warn from 2.16 [\#871](https://github.com/dev-sec/ansible-collection-hardening/issues/871)
**Merged pull requests:**
- Use fixed test env for BSD VMs [\#884](https://github.com/dev-sec/ansible-collection-hardening/pull/884) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
- Downgrade community.crypto for rocky8 [\#882](https://github.com/dev-sec/ansible-collection-hardening/pull/882) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): update dependency aar-doc to v2.2.0 [\#877](https://github.com/dev-sec/ansible-collection-hardening/pull/877) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update creyd/prettier\_action action to v4.6 [\#876](https://github.com/dev-sec/ansible-collection-hardening/pull/876) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 06f616d [\#873](https://github.com/dev-sec/ansible-collection-hardening/pull/873) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.18.6 [\#872](https://github.com/dev-sec/ansible-collection-hardening/pull/872) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update creyd/prettier\_action action to v4.5 [\#869](https://github.com/dev-sec/ansible-collection-hardening/pull/869) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(ssh\_hardening\): ansible 2.19 compatibility [\#868](https://github.com/dev-sec/ansible-collection-hardening/pull/868) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([Nemental](https://github.com/Nemental))
- chore\(deps\): update ansible/ansible-lint digest to e98f9b3 [\#867](https://github.com/dev-sec/ansible-collection-hardening/pull/867) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/setup-python digest to a26af69 [\#866](https://github.com/dev-sec/ansible-collection-hardening/pull/866) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.18.5 [\#865](https://github.com/dev-sec/ansible-collection-hardening/pull/865) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to c16f018 [\#863](https://github.com/dev-sec/ansible-collection-hardening/pull/863) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 6a4fcdb [\#862](https://github.com/dev-sec/ansible-collection-hardening/pull/862) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency aar-doc to v2.1.0 [\#861](https://github.com/dev-sec/ansible-collection-hardening/pull/861) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.18.4 [\#860](https://github.com/dev-sec/ansible-collection-hardening/pull/860) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/setup-python digest to 8d9ed9a [\#859](https://github.com/dev-sec/ansible-collection-hardening/pull/859) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- Fix: ForwardAgent j2 template space [\#856](https://github.com/dev-sec/ansible-collection-hardening/pull/856) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([cod3mas0n](https://github.com/cod3mas0n))
- chore\(deps\): update artis3n/ansible\_galaxy\_collection digest to f6110ae [\#853](https://github.com/dev-sec/ansible-collection-hardening/pull/853) ([renovate[bot]](https://github.com/apps/renovate))
## [10.3.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.3.0) (2025-02-25)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.2.0...10.3.0)
**Implemented enhancements:**
- Password expiry for users without password should not block SSH key based login [\#681](https://github.com/dev-sec/ansible-collection-hardening/issues/681)
- Set number of warning days before password expires for existing users [\#839](https://github.com/dev-sec/ansible-collection-hardening/pull/839) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([Normo](https://github.com/Normo))
- Allow to override settings for sftponly users [\#794](https://github.com/dev-sec/ansible-collection-hardening/pull/794) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([mib1185](https://github.com/mib1185))
**Closed issues:**
- os\_hardening & sysctl\_overwrite with host\_vars [\#837](https://github.com/dev-sec/ansible-collection-hardening/issues/837)
**Merged pull requests:**
- chore\(deps\): update dependency ansible-core to v2.18.3 [\#852](https://github.com/dev-sec/ansible-collection-hardening/pull/852) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 49ded6a [\#851](https://github.com/dev-sec/ansible-collection-hardening/pull/851) ([renovate[bot]](https://github.com/apps/renovate))
- Pin runner image to specific version to decouple from GitHub updates [\#847](https://github.com/dev-sec/ansible-collection-hardening/pull/847) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- Refactor: combine multiple set\_fact into single jinja filter [\#846](https://github.com/dev-sec/ansible-collection-hardening/pull/846) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([Tinyblargon](https://github.com/Tinyblargon))
- chore\(deps\): update actions/setup-python digest to 4237552 [\#844](https://github.com/dev-sec/ansible-collection-hardening/pull/844) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.18.2 [\#843](https://github.com/dev-sec/ansible-collection-hardening/pull/843) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency molecule to v25 [\#841](https://github.com/dev-sec/ansible-collection-hardening/pull/841) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint action to v25 [\#840](https://github.com/dev-sec/ansible-collection-hardening/pull/840) ([renovate[bot]](https://github.com/apps/renovate))
## [10.2.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.2.0) (2024-12-23)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.1.0...10.2.0)
**Implemented enhancements:**
- Re-enable OpenBSD tests [\#826](https://github.com/dev-sec/ansible-collection-hardening/issues/826) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)]
- Allow configuring the name\_format variable in auditd config [\#796](https://github.com/dev-sec/ansible-collection-hardening/issues/796) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)]
- Modify PAM to allow SSH key based logins with locked passwords [\#835](https://github.com/dev-sec/ansible-collection-hardening/pull/835) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
- adding switch for ForwardAgent in ssh\_config [\#818](https://github.com/dev-sec/ansible-collection-hardening/pull/818) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([Shizzlebix](https://github.com/Shizzlebix))
**Fixed bugs:**
- File system loop detected; ‘/bin/X11’ is part of the same file system loop as ‘/bin’." [\#815](https://github.com/dev-sec/ansible-collection-hardening/issues/815) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)]
- Not working ssh\_hardening on Centos 7 [\#813](https://github.com/dev-sec/ansible-collection-hardening/issues/813) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)]
**Merged pull requests:**
- chore\(deps\): update dependency molecule-plugins to v23.6.0 [\#834](https://github.com/dev-sec/ansible-collection-hardening/pull/834) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 4ce8e49 [\#832](https://github.com/dev-sec/ansible-collection-hardening/pull/832) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency molecule to v24.12.0 [\#831](https://github.com/dev-sec/ansible-collection-hardening/pull/831) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.18.1 [\#829](https://github.com/dev-sec/ansible-collection-hardening/pull/829) ([renovate[bot]](https://github.com/apps/renovate))
- Change installation source for OpenBSD tests [\#828](https://github.com/dev-sec/ansible-collection-hardening/pull/828) ([schurzi](https://github.com/schurzi))
- chore\(deps\): update ansible/ansible-lint digest to 44be233 [\#825](https://github.com/dev-sec/ansible-collection-hardening/pull/825) ([renovate[bot]](https://github.com/apps/renovate))
- Bump ansible-core from 2.17.5 to 2.17.6 [\#820](https://github.com/dev-sec/ansible-collection-hardening/pull/820) ([dependabot[bot]](https://github.com/apps/dependabot))
- chore\(deps\): update dependency ansible-core to v2.18.0 [\#819](https://github.com/dev-sec/ansible-collection-hardening/pull/819) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency aar-doc to v2.0.1 [\#817](https://github.com/dev-sec/ansible-collection-hardening/pull/817) ([renovate[bot]](https://github.com/apps/renovate))
- Update actions/setup-python digest to 0b93645 [\#814](https://github.com/dev-sec/ansible-collection-hardening/pull/814) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/checkout digest to 11bd719 [\#812](https://github.com/dev-sec/ansible-collection-hardening/pull/812) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
## [10.1.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.1.0) (2024-10-22)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/10.0.0...10.1.0)
**Implemented enhancements:**
- Ubuntu 24.04 support [\#764](https://github.com/dev-sec/ansible-collection-hardening/issues/764)
- Add variable to set name\_format for auditd [\#810](https://github.com/dev-sec/ansible-collection-hardening/pull/810) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
- feat\(ssh\): add alpine support [\#809](https://github.com/dev-sec/ansible-collection-hardening/pull/809) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- Provide granular noop for ssh configuration [\#789](https://github.com/dev-sec/ansible-collection-hardening/pull/789) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([seven-beep](https://github.com/seven-beep))
**Fixed bugs:**
- molecule scenario ssh\_hardening if failing due to missing docker image [\#790](https://github.com/dev-sec/ansible-collection-hardening/issues/790)
- getent\_shadow empty [\#787](https://github.com/dev-sec/ansible-collection-hardening/issues/787)
- Error: Missing privilege separation directory: /run/sshd [\#752](https://github.com/dev-sec/ansible-collection-hardening/issues/752)
- fix\(ssh\_hardening\): test setting kex to false, remove wrong default [\#808](https://github.com/dev-sec/ansible-collection-hardening/pull/808) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
**Merged pull requests:**
- Pin python dependencies and optimize GitHub Actions [\#811](https://github.com/dev-sec/ansible-collection-hardening/pull/811) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- fix\(cicd\): test idempotence on ssh custom tests [\#807](https://github.com/dev-sec/ansible-collection-hardening/pull/807) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- Document correct quotes for ssh\_permit\_tunnel parameter [\#806](https://github.com/dev-sec/ansible-collection-hardening/pull/806) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([vmpr](https://github.com/vmpr))
- fix\(docs\): add 'become: true' to example playbooks. fix \#787 [\#804](https://github.com/dev-sec/ansible-collection-hardening/pull/804) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- chore\(deps\): update dependency ansible-core to v2.17.5 [\#802](https://github.com/dev-sec/ansible-collection-hardening/pull/802) ([renovate[bot]](https://github.com/apps/renovate))
- Don't run tests if the environment is not correct [\#801](https://github.com/dev-sec/ansible-collection-hardening/pull/801) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): update actions/checkout digest to eef6144 [\#800](https://github.com/dev-sec/ansible-collection-hardening/pull/800) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- feat: Corrected package name [\#799](https://github.com/dev-sec/ansible-collection-hardening/pull/799) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([PapaPeskwo](https://github.com/PapaPeskwo))
- Use Python venv for VM tests [\#798](https://github.com/dev-sec/ansible-collection-hardening/pull/798) ([schurzi](https://github.com/schurzi))
- Remove unused files and variables [\#797](https://github.com/dev-sec/ansible-collection-hardening/pull/797) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): update ansible/ansible-lint digest to 3b5bee1 [\#795](https://github.com/dev-sec/ansible-collection-hardening/pull/795) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 25f783c [\#792](https://github.com/dev-sec/ansible-collection-hardening/pull/792) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.17.4 [\#791](https://github.com/dev-sec/ansible-collection-hardening/pull/791) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/setup-python digest to f677139 [\#788](https://github.com/dev-sec/ansible-collection-hardening/pull/788) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.17.3 [\#786](https://github.com/dev-sec/ansible-collection-hardening/pull/786) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update dependency ansible-core to v2.17.2 [\#756](https://github.com/dev-sec/ansible-collection-hardening/pull/756) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
## [10.0.0](https://github.com/dev-sec/ansible-collection-hardening/tree/10.0.0) (2024-08-06)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/9.0.1...10.0.0)
**Implemented enhancements:**
- option to disable regeneration of ssh private key [\#772](https://github.com/dev-sec/ansible-collection-hardening/issues/772)
- Support systemd socket activation for sshd [\#763](https://github.com/dev-sec/ansible-collection-hardening/issues/763) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)]
- Release 9.0.2 [\#758](https://github.com/dev-sec/ansible-collection-hardening/issues/758)
- Make Publickey authentication configurable [\#750](https://github.com/dev-sec/ansible-collection-hardening/issues/750)
- Ansible Linting [\#747](https://github.com/dev-sec/ansible-collection-hardening/issues/747)
- Make value of kernel.unprivileged\_userns\_clone depending on kernel version [\#727](https://github.com/dev-sec/ansible-collection-hardening/issues/727)
- Ensure that ssh is installed \(cf \#771\) [\#774](https://github.com/dev-sec/ansible-collection-hardening/pull/774) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([Byh0ki](https://github.com/Byh0ki))
- ssh: explicitly enable or disable the service at boot [\#771](https://github.com/dev-sec/ansible-collection-hardening/pull/771) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([Byh0ki](https://github.com/Byh0ki))
- disable systemd socket activation [\#769](https://github.com/dev-sec/ansible-collection-hardening/pull/769) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- Add ssh\_pubkey\_authentication variable to ssh hardening [\#749](https://github.com/dev-sec/ansible-collection-hardening/pull/749) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([debbabi](https://github.com/debbabi))
**Fixed bugs:**
- ssh hardening role fails when `ssh_permit_root_login` var is set on ubuntu 24.04 [\#768](https://github.com/dev-sec/ansible-collection-hardening/issues/768)
- os\_hardening fails when setting vm.mmap\_rnd\_bits [\#757](https://github.com/dev-sec/ansible-collection-hardening/issues/757)
- `ssh_gateway_ports` is documented to accept 'clientspecified' string, but only accepts bools [\#755](https://github.com/dev-sec/ansible-collection-hardening/issues/755)
- Error: Missing privilege separation directory: /run/sshd [\#752](https://github.com/dev-sec/ansible-collection-hardening/issues/752)
- harden permissions for directory mount /var/log fails for minimized Ubuntu 22.04 [\#741](https://github.com/dev-sec/ansible-collection-hardening/issues/741)
- Update Debian compatibility [\#784](https://github.com/dev-sec/ansible-collection-hardening/pull/784) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- do not force type of ssh\_gateway\_ports [\#765](https://github.com/dev-sec/ansible-collection-hardening/pull/765) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
**Merged pull requests:**
- Update to current Fedora releases [\#783](https://github.com/dev-sec/ansible-collection-hardening/pull/783) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
- Remove deprecated rebuild of initrd [\#782](https://github.com/dev-sec/ansible-collection-hardening/pull/782) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): update patrickjahns/version-drafter-action digest to 2076fa4 [\#781](https://github.com/dev-sec/ansible-collection-hardening/pull/781) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update ansible/ansible-lint digest to 95382d3 [\#779](https://github.com/dev-sec/ansible-collection-hardening/pull/779) ([renovate[bot]](https://github.com/apps/renovate))
- chore\(deps\): update actions/setup-python digest to 39cd149 [\#778](https://github.com/dev-sec/ansible-collection-hardening/pull/778) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- remove tests for FreeBSD12 since it's out of support [\#777](https://github.com/dev-sec/ansible-collection-hardening/pull/777) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
- chore\(deps\): pin dependencies [\#776](https://github.com/dev-sec/ansible-collection-hardening/pull/776) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- Use best-practice preset for renovate [\#775](https://github.com/dev-sec/ansible-collection-hardening/pull/775) ([schurzi](https://github.com/schurzi))
- Deprecate Centos Stream 8 [\#770](https://github.com/dev-sec/ansible-collection-hardening/pull/770) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- centos7 is eol, remove it [\#767](https://github.com/dev-sec/ansible-collection-hardening/pull/767) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- fix spelling [\#766](https://github.com/dev-sec/ansible-collection-hardening/pull/766) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- ci: define permissions for enforce-labels workflow [\#760](https://github.com/dev-sec/ansible-collection-hardening/pull/760) ([fgreinacher](https://github.com/fgreinacher))
- Update dependency ansible-core to v2.16.5 [\#754](https://github.com/dev-sec/ansible-collection-hardening/pull/754) ([renovate[bot]](https://github.com/apps/renovate))
- Update dependency ansible-core to v2.16.4 [\#751](https://github.com/dev-sec/ansible-collection-hardening/pull/751) ([renovate[bot]](https://github.com/apps/renovate))
@@ -1103,6 +853,7 @@
- Standardize the var ordering [\#251](https://github.com/dev-sec/ansible-collection-hardening/pull/251) ([dustinmiller](https://github.com/dustinmiller))
- Add initial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-collection-hardening/pull/250) ([dustinmiller](https://github.com/dustinmiller))
- Make max\_log\_file\_action for auditd configurable [\#246](https://github.com/dev-sec/ansible-collection-hardening/pull/246) ([jandd](https://github.com/jandd))
- Add exception in sysctl task [\#240](https://github.com/dev-sec/ansible-collection-hardening/pull/240) ([ghost](https://github.com/ghost))
- Fedora - Use new auto ansible\_python\_interpreter for dnf [\#239](https://github.com/dev-sec/ansible-collection-hardening/pull/239) ([jaredledvina](https://github.com/jaredledvina))
- add test support for CentOS8 [\#237](https://github.com/dev-sec/ansible-collection-hardening/pull/237) ([yeoldegrove](https://github.com/yeoldegrove))
- Support configuring SELinux and default to enforcing [\#236](https://github.com/dev-sec/ansible-collection-hardening/pull/236) ([jaredledvina](https://github.com/jaredledvina))
@@ -1143,7 +894,7 @@
- remove prelink package, control package-09 [\#135](https://github.com/dev-sec/ansible-collection-hardening/pull/135) ([rndmh3ro](https://github.com/rndmh3ro))
- style update [\#134](https://github.com/dev-sec/ansible-collection-hardening/pull/134) ([rndmh3ro](https://github.com/rndmh3ro))
- Remove deprecated include for static tasks and use instead import\_tasks fix \#131 [\#132](https://github.com/dev-sec/ansible-collection-hardening/pull/132) ([HelioCampos](https://github.com/HelioCampos))
- Fix ansible.cfg and use comment filter [\#130](https://github.com/dev-sec/ansible-collection-hardening/pull/130) ([FazleArefin](https://github.com/FazleArefin))
- Fix ansible.cfg and use comment filter [\#130](https://github.com/dev-sec/ansible-collection-hardening/pull/130) ([fazlearefin](https://github.com/fazlearefin))
- install initramfs-tools [\#114](https://github.com/dev-sec/ansible-collection-hardening/pull/114) ([rndmh3ro](https://github.com/rndmh3ro))
- omit empty variables [\#106](https://github.com/dev-sec/ansible-collection-hardening/pull/106) ([rndmh3ro](https://github.com/rndmh3ro))
- Supports --check mode [\#93](https://github.com/dev-sec/ansible-collection-hardening/pull/93) ([conorsch](https://github.com/conorsch))
@@ -1210,6 +961,7 @@
- replace module parameter fixed [\#297](https://github.com/dev-sec/ansible-collection-hardening/pull/297) ([danielkubat](https://github.com/danielkubat))
- Addressing issue \#255 [\#258](https://github.com/dev-sec/ansible-collection-hardening/pull/258) ([ljkimmel](https://github.com/ljkimmel))
- Fix \#247, cleanup conditions [\#248](https://github.com/dev-sec/ansible-collection-hardening/pull/248) ([fernandezcuesta](https://github.com/fernandezcuesta))
- Fix error on applying the sysctl vars on containers [\#243](https://github.com/dev-sec/ansible-collection-hardening/pull/243) ([ghost](https://github.com/ghost))
- Update location of NSA RHEL 5 Guide [\#235](https://github.com/dev-sec/ansible-collection-hardening/pull/235) ([jaredledvina](https://github.com/jaredledvina))
- Fix typo [\#212](https://github.com/dev-sec/ansible-collection-hardening/pull/212) ([ruslo](https://github.com/ruslo))
- Update modprobe to 0644 [\#211](https://github.com/dev-sec/ansible-collection-hardening/pull/211) ([joshuatalb](https://github.com/joshuatalb))
-15
View File
@@ -93,21 +93,6 @@ We generally include test for coding guidelines:
Remember: Code is generally read much more often than written.
### Local testing of roles in this collection
We are using Molecule to test our roles.
If you want to execute the tests on your machine you need Docker and Molecule.
You will also need to set the `MOLECULE_DISTRO` environment variable to execute the tests.
To find valid values for the variable you can take a look at our GitHub Action workflows in `.github/workflows/`.
Example for executing tests locally:
```bash
pip install -r requirements.txt
export MOLECULE_DISTRO="debian12"
molecule test -s os_hardening
```
### Use Markdown
Wherever possible, please refrain from any other formats and stick to simple markdown.
+7 -8
View File
@@ -3,7 +3,7 @@
[![devsec.os_hardening](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/os_hardening.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/os_hardening.yml)
[![devsec.os_hardening VM](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/os_hardening_vm.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/os_hardening_vm.yml)
[![devsec.ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening.yml)
[![devsec.ssh_hardening VM](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_vm.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_vm.yml)
[![devsec.ssh_hardening BSD](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_bsd.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_bsd.yml)
[![devsec.ssh_hardening with custom tests](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_custom_tests.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_custom_tests.yml)
[![devsec.nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/nginx_hardening.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/nginx_hardening.yml)
[![devsec.mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/mysql_hardening.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/mysql_hardening.yml)
@@ -13,14 +13,13 @@
This collection provides battle tested hardening for:
- Linux operating systems:
- CentOS Stream 9
- AlmaLinux 8/9/10
- Rocky Linux 8/9/10
- Debian 11/12/13
- Ubuntu 22.04/24.04/26.04
- CentOS 7/8/9
- Rocky Linux 8/9
- Debian 10/11/12
- Ubuntu 18.04/20.04/22.04
- Amazon Linux (some roles supported)
- Arch Linux (some roles supported)
- Fedora 42/43/44 (some roles supported)
- Fedora 37/38 (some roles supported)
- Suse Tumbleweed (some roles supported)
- MySQL
- MariaDB >= 5.5.65, >= 10.1.45, >= 10.3.17
@@ -51,7 +50,7 @@ The other roles are in separate archives repositories:
## Minimum required Ansible-version
- Ansible >= 2.16
- Ansible >= 2.9.10
## Included content
+1 -1
View File
@@ -1,6 +1,6 @@
namespace: devsec
name: hardening
version: 10.5.2
version: 9.0.1
readme: README.md
authors:
- dev-sec <[email protected]>
+11 -3
View File
@@ -12,14 +12,22 @@
mysql_python_package_debian: python3-pymysql
when:
- mysql_python_package_debian is not defined
- ansible_facts.distribution == "Ubuntu"
- ansible_facts.distribution_major_version|int > 19
- ansible_distribution == "Ubuntu"
- ansible_distribution_major_version|int > 19
- name: Determine required MySQL Python libraries.
ansible.builtin.set_fact:
mysql_python_package_debian: "{% if 'python3' in ansible_python_interpreter | default('') %}python3-mysqldb{% else %}python-mysqldb{% endif %}"
when:
- mysql_python_package_debian is not defined
- ansible_distribution != "Ubuntu"
- ansible_distribution_major_version|int < 20
- name: Use Python 3 on Suse
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python3
when:
- ansible_facts.os_family == 'Suse'
- ansible_os_family == 'Suse'
- name: Include mysql_hardening role
ansible.builtin.include_role:
+1 -5
View File
@@ -22,9 +22,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
# Currently not supported by dev-sec.mysql role
# inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -35,7 +33,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -51,7 +48,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
+26 -11
View File
@@ -17,25 +17,32 @@
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python3
when:
- ansible_facts.distribution == 'Debian'
- ansible_facts.distribution_major_version|int >= 11
- ansible_distribution == 'Debian'
- ansible_distribution_major_version|int >= 11
- name: Use Python 3 on Suse
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python3
when:
- ansible_facts.os_family == 'Suse'
- ansible_os_family == 'Suse'
- name: Use Python 2 on Debian 10
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python
when:
- ansible_distribution == 'Debian'
- ansible_distribution_major_version|int == 10
- name: Run the equivalent of "apt-get update && apt-get upgrade"
ansible.builtin.apt:
upgrade: safe
update_cache: true
when: ansible_facts.os_family == 'Debian'
when: ansible_os_family == 'Debian'
- name: Install required python packages on Suse
ansible.builtin.command: zypper -n install python311-rpm python311-PyMySQL
ansible.builtin.command: zypper -n install python-xml python3-rpm python3-PyMySQL
changed_when: false
when: ansible_facts.os_family == 'Suse'
when: ansible_os_family == 'Suse'
- name: Create missing directory
ansible.builtin.file:
@@ -48,15 +55,23 @@
mysql_python_package_debian: python3-pymysql
when:
- mysql_python_package_debian is not defined
- ansible_facts.distribution == "Ubuntu"
- ansible_facts.distribution_major_version|int > 19
- ansible_distribution == "Ubuntu"
- ansible_distribution_major_version|int > 19
- name: Determine required MySQL Python libraries.
ansible.builtin.set_fact:
mysql_python_package_debian: "{% if 'python3' in ansible_python_interpreter | default('') %}python3-mysqldb{% else %}python-mysqldb{% endif %}"
when:
- mysql_python_package_debian is not defined
- ansible_distribution != "Ubuntu"
- ansible_distribution_major_version|int < 20
- name: Install required MySQL Python libraries on RHEL
ansible.builtin.dnf:
ansible.builtin.yum:
name: "{% if 'python3' in ansible_python_interpreter | default('') %}python36-PyMySQL{% else %}python2-PyMySQL{% endif %}"
when:
- ansible_facts.os_family == "RedHat"
- ansible_facts.distribution_major_version == "7"
- ansible_os_family == "RedHat"
- ansible_distribution_major_version == "7"
- name: Install mysql with a generic Ansible role
ansible.builtin.include_role:
@@ -1,6 +1,6 @@
---
- name: Create users for test
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query:
- CREATE USER 'user'@'delete';
- CREATE USER 'user'@'127.0.0.1';
@@ -15,7 +15,7 @@
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
- name: Detect role support on MySQL
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'
@@ -24,7 +24,7 @@
register: mysql_role_support
- name: Create roles for test
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query:
- CREATE ROLE 'role_keep';
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
@@ -2,3 +2,8 @@
roles:
- name: dev-sec.mysql
version: master
collections:
- name: https://github.com/ansible-collections/community.mysql.git
type: git
version: main
+2 -2
View File
@@ -11,14 +11,14 @@
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python3
when:
- ansible_facts.os_family == 'Suse'
- ansible_os_family == 'Suse'
- name: Install procps for debian systems
ansible.builtin.apt:
name: procps
state: present
update_cache: true
when: ansible_facts.distribution == 'Debian'
when: ansible_distribution == 'Debian'
- name: Include tests for the service
ansible.builtin.include_tasks: verify_tasks/service.yml
@@ -1,6 +1,6 @@
---
- name: Get all users from MySQL server
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
SELECT CONCAT(USER, '@', HOST) AS users FROM mysql.user;
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
@@ -25,7 +25,7 @@
- '"[email protected].%" in mysql_users_list'
- name: Detect role support on MySQL
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'
+1 -5
View File
@@ -21,9 +21,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
# Currently not supported by geerlingguy.nginx role
# inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -34,7 +32,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -50,7 +47,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
+7 -1
View File
@@ -7,6 +7,12 @@
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
tasks:
- name: Install required tools on SuSE
community.general.zypper:
name: python-xml
state: present
when: ansible_facts.os_family == 'Suse'
- name: Install required packages
ansible.builtin.package:
name: python3-apt
@@ -16,7 +22,7 @@
- name: Set correct distribution Version for Amazon Linux
ansible.builtin.set_fact:
ansible_distribution_major_version: 7
when: ansible_facts.distribution == 'Amazon'
when: ansible_distribution == 'Amazon'
- name: Install nginx with a generic Ansible role
ansible.builtin.include_role:
+1 -1
View File
@@ -12,7 +12,7 @@
name: procps
state: present
update_cache: true
when: ansible_facts.distribution == 'Debian'
when: ansible_distribution == 'Debian'
- name: Verify
hosts: localhost
+2 -1
View File
@@ -16,10 +16,11 @@
vars:
os_security_users_allow: change_user
os_security_kernel_enable_core_dump: false
os_auditd_enabled: false
os_auditd_num_logs: 10
os_security_suid_sgid_remove_from_unknown: true
os_auth_pam_passwdqc_enable: false
os_auth_lockout_time: 15
os_desktop_enable: true
os_env_extra_user_paths: [/home]
os_auth_allow_homeless: true
os_security_suid_sgid_blacklist: [/bin/umount]
+1 -4
View File
@@ -17,8 +17,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -29,7 +28,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -45,7 +43,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
+3 -3
View File
@@ -16,11 +16,11 @@
ansible.builtin.apt:
upgrade: safe
update_cache: true
when: ansible_facts.os_family == 'Debian'
when: ansible_os_family == 'Debian'
- name: Install required tools on SuSE
# cannot use zypper module, since it depends on python-xml
ansible.builtin.command: zypper -n install awk
ansible.builtin.command: zypper -n install python-xml awk
changed_when: false
when: ansible_facts.os_family == 'Suse'
@@ -41,7 +41,7 @@
when: ansible_facts.os_family == 'Archlinux'
- name: Install required tools on RHEL # noqa ignore-errors
ansible.builtin.dnf:
ansible.builtin.yum:
name:
- openssh-clients
- openssh
@@ -3,10 +3,8 @@
user:
name: pw_no_ageing
password: $6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1
password_expire_max: "-1"
- name: Create user those password ageing should be changed
user:
name: pw_ageing
password: $6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1
password_expire_max: "-1"
+1 -4
View File
@@ -20,7 +20,6 @@
- verify_tasks/pw_ageing.yml
- verify_tasks/netrc.yml
- verify_tasks/ignore_home_folders.yml
- verify_tasks/ssh_auth_locked.yml
# temp. disabled - https://github.com/dev-sec/ansible-collection-hardening/issues/690
# - name: Include PAM tests
@@ -68,14 +67,12 @@
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
vars:
os_auditd_enabled: false
os_env_umask: "027 #override"
tasks:
# test if variable can be overridden
- name: Workaround for https://github.com/ansible/ansible/issues/66304
ansible.builtin.set_fact:
ansible_virtualization_type: docker
os_env_umask: "027 #override"
- name: Include os_hardening role
ansible.builtin.include_role:
@@ -19,7 +19,7 @@
# this uses the date from the expire_date variable and subtracts the current date.
# it should be bigger that the password_expire_min of the user "pw_no_ageing"
that:
- ( expiry_date.stdout | trim | to_datetime('%b %d, %Y') - ansible_facts.date_time.date | to_datetime('%Y-%m-%d')).days == 60
- ( expiry_date.stdout | trim | to_datetime('%b %d, %Y') - ansible_date_time.date | to_datetime('%Y-%m-%d')).days == 60
- name: Get Password Expiry warning days for pw_ageing
ansible.builtin.shell: chage -l pw_ageing | grep "warning before password expires" | cut -d ":" -f 2
@@ -1,90 +0,0 @@
---
- name: Install tools
package:
name: "{{ item }}"
state: present
ignore_errors: true
loop:
- sshpass
- openssh
- openssh-clients
- openssh-server
- name: Allow password Login for sshd
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
search_string: PasswordAuthentication no
line: PasswordAuthentication yes
when:
- ansible_facts.distribution == "Amazon"
- name: Start sshd service
ansible.builtin.service:
name: "{{ item }}"
state: started
ignore_errors: true
loop:
- sshd
- ssh
- name: Set password for test
ansible.builtin.set_fact:
test_pw: myTest!pw
- name: Create locked_user
user:
name: locked_user
password: "{{ test_pw | password_hash('sha512') }}"
- name: Create ssh-client-keypair
community.crypto.openssh_keypair:
path: /root/locked_user_id
type: ed25519
state: present
register: generated_key
- name: Add ssh-public-key to locked_user
ansible.posix.authorized_key:
user: locked_user
key: "{{ generated_key.public_key }}"
state: present
- name: Check successful login with password
ansible.builtin.shell:
cmd: sshpass -p {{ test_pw }} ssh -o StrictHostKeyChecking=no locked_user@localhost echo "success"
- name: Check successful login with ssh key
ansible.builtin.shell:
cmd: ssh -i /root/locked_user_id -o StrictHostKeyChecking=no locked_user@localhost echo "success"
- name: Set password change date for locked_user
ansible.builtin.shell:
cmd: chage -d 2020-01-01 locked_user
- name: Check unsuccessful login with password
ansible.builtin.shell:
cmd: sshpass -p {{ test_pw }} ssh -o StrictHostKeyChecking=no locked_user@localhost echo "success"
register: output
ignore_errors: true
- name: Assert check unsuccessful login
ansible.builtin.assert:
that:
- output.rc | int == 1
- "'WARNING: Your password has expired.' in output.stderr"
- "'success' not in output.stdout"
when:
- ansible_facts.os_family != "Suse"
- name: Assert check unsuccessful login
ansible.builtin.assert:
that:
- output.rc | int == 5
- "'(password expired)' in output.stderr"
- output.stdout | length == 0
when:
- ansible_facts.os_family == "Suse"
- name: Check successful login with ssh key
ansible.builtin.shell:
cmd: ssh -i /root/locked_user_id -o StrictHostKeyChecking=no locked_user@localhost echo "success"
@@ -6,4 +6,4 @@
- name: Check that shell_sys_acc's shell is still bash
ansible.builtin.assert:
that:
- ansible_facts.getent_passwd['shell_sys_acc'][5] == "/bin/bash"
- getent_passwd['shell_sys_acc'][5] == "/bin/bash"
-21
View File
@@ -14,33 +14,12 @@
os_mnt_tmp_src: tmpfs
os_mnt_tmp_filesystem: tmpfs
when: ansible_facts.os_family == 'Archlinux'
- name: Overrides for Fedora image
ansible.builtin.set_fact:
os_mnt_tmp_enabled: true
os_mnt_tmp_src: tmpfs
os_mnt_tmp_filesystem: tmpfs
when: ansible_facts.distribution == 'Fedora'
- name: Overrides for Fedora 40 image
ansible.builtin.set_fact:
os_mnt_var_enabled: true
os_mnt_var_src: UUID=282c6d73-afc2-4113-9856-c7679ad51920
os_mnt_var_filesystem: btrfs
os_mnt_var_options: rw,nosuid,nodev,compress=zstd:1,subvol=var
when:
- ansible_facts.distribution == 'Fedora'
- ansible_facts.distribution_major_version|int == 40
- name: Overrides for Debian 13 image
ansible.builtin.set_fact:
os_mnt_tmp_enabled: true
os_mnt_tmp_src: tmpfs
os_mnt_tmp_filesystem: tmpfs
when:
- ansible_facts.distribution == 'Debian'
- ansible_facts.distribution_major_version|int == 13
- name: Include os_hardening role
ansible.builtin.include_role:
name: devsec.hardening.os_hardening
+1 -6
View File
@@ -24,10 +24,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
# Workaround for https://github.com/ansible-community/molecule-plugins/issues/301
library: "${MOLECULE_PROJECT_DIRECTORY}/plugins/modules:/usr/share/ansible:${MOLECULE_VAGRANT_PLUGIN_DIR}"
inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
env:
@@ -40,7 +37,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -56,7 +52,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
+13 -30
View File
@@ -4,16 +4,6 @@
become: true
gather_facts: false
tasks:
- name: Update keyring
ansible.builtin.raw: pacman --noconfirm -Sy archlinux-keyring
changed_when: false
when: lookup('env', 'MOLECULE_DISTRO') == 'generic/arch'
- name: Update OS
ansible.builtin.raw: pacman --noconfirm -Suy
changed_when: false
when: lookup('env', 'MOLECULE_DISTRO') == 'generic/arch'
- name: Install python, since it's not installed by default
ansible.builtin.raw: pacman --noconfirm -Sy python
changed_when: false
@@ -36,7 +26,7 @@
ansible.builtin.dpkg_selections:
name: grub-pc
selection: hold
when: ansible_facts.os_family == 'Debian'
when: ansible_os_family == 'Debian'
# we need to free up space, since the /boot partition in some Vagrant images is
# pretty small and system updates might fail
@@ -45,20 +35,26 @@
paths: /boot
patterns: "initrd.img*"
register: find_results
when: ansible_facts.os_family == 'Debian'
when: ansible_os_family == 'Debian'
- name: Delete all initrd.img to free space on /boot
ansible.builtin.file:
path: "{{ item['path'] }}"
state: absent
with_items: "{{ find_results['files'] }}"
when: ansible_facts.os_family == 'Debian'
when: ansible_os_family == 'Debian'
- name: Run the equivalent of "apt-get update && apt-get upgrade"
ansible.builtin.apt:
upgrade: safe
update_cache: true
when: ansible_facts.os_family == 'Debian'
when: ansible_os_family == 'Debian'
- name: Install required tools on SuSE
# cannot use zypper module, since it depends on python-xml
ansible.builtin.command: zypper -n install python-xml
changed_when: false
when: ansible_facts.os_family == 'Suse'
- name: Install required tools on fedora
ansible.builtin.dnf:
@@ -66,32 +62,18 @@
- python
- findutils
- procps-ng
- python3-libselinux
when: ansible_facts.distribution == 'Fedora'
- name: Install required tools on AlmaLinux
ansible.builtin.dnf:
name:
- initscripts
when: ansible_facts.distribution == 'AlmaLinux'
- name: Install required tools on Arch
community.general.pacman:
name:
- awk
- archlinux-keyring
state: latest
state: present
update_cache: true
when: ansible_facts.os_family == 'Archlinux'
- name: Run the equivalent of "pacman -Syu"
community.general.pacman:
update_cache: true
upgrade: true
when: ansible_facts.os_family == 'Archlinux'
- name: Install required tools on RHEL # noqa ignore-errors
ansible.builtin.dnf:
ansible.builtin.yum:
name:
- openssh-clients
- openssh
@@ -107,6 +89,7 @@
ansible.posix.mount:
path: /boot/efi
state: unmounted
when: ansible_facts.distribution == 'Fedora'
- name: Include YUM prepare tasks
ansible.builtin.include_tasks: prepare_tasks/yum.yml
-9
View File
@@ -1,9 +0,0 @@
---
- name: Verify prerequisites
hosts: localhost
tasks:
- name: Make sure environment variable for MOLECULE_DISTRO is set
ansible.builtin.assert:
that:
- "lookup('env','MOLECULE_DISTRO') | length > 0"
fail_msg: "You need to set MOLECULE_DISTRO to a supported image name. See CONTRIBUTING.md"
+1 -4
View File
@@ -17,8 +17,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
inventory:
host_vars:
# https://molecule.readthedocs.io/en/latest/examples.html#docker-with-non-privileged-user
@@ -35,7 +34,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -51,7 +49,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
+20 -22
View File
@@ -1,5 +1,5 @@
---
- name: Prepare the molecule container for the role
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
hosts: all
become: true
environment:
@@ -12,32 +12,27 @@
ansible_python_interpreter: /usr/bin/python3
when: ansible_facts.distribution == 'Fedora'
- name: Install dnf packages # noqa ignore-errors
ansible.builtin.dnf:
- name: Install packages # noqa ignore-errors
ansible.builtin.yum:
name:
- openssh-clients
- openssh-server
state: present
update_cache: true
ignore_errors: true
- name: Install libselinux-python # noqa ignore-errors
ansible.builtin.dnf:
name:
- libselinux-python
state: present
update_cache: true
ignore_errors: true
- name: Install procps-ng # noqa ignore-errors
- name: Install packages # noqa ignore-errors
ansible.builtin.dnf:
name:
- openssh-clients
- openssh-server
- procps-ng
state: present
update_cache: true
ignore_errors: true
- name: Install apt packages # noqa ignore-errors
- name: Install packages # noqa ignore-errors
ansible.builtin.apt:
name:
- openssh-client
@@ -52,20 +47,12 @@
changed_when: false
when: ansible_facts.os_family == 'Suse'
- name: Install packages on SuSE
- name: Install packages
community.general.zypper:
name:
- openssh
when: ansible_facts.os_family == 'Suse'
- name: Install required tools on Alpine
community.general.apk:
name:
- openssh
state: present
update_cache: true
when: ansible_facts.os_family == 'Alpine'
- name: Install required tools on Arch
community.general.pacman:
name:
@@ -75,6 +62,17 @@
update_cache: true
when: ansible_facts.os_family == 'Archlinux'
- name: Create ssh host keys # noqa ignore-errors no-changed-when
- name: Created needed directory
ansible.builtin.file:
path: /var/run/sshd
state: directory
mode: "0755"
- name: Create ssh host keys # noqa ignore-errors
ansible.builtin.command: ssh-keygen -A
when: not ((ansible_facts.os_family in ['Oracle Linux', 'RedHat']) and ansible_facts.distribution_major_version < '7')
or ansible_facts.distribution == "Fedora"
or ansible_facts.distribution == "Amazon"
or ansible_facts.os_family == "Suse"
changed_when: false
ignore_errors: true
File renamed without changes.
@@ -8,7 +8,7 @@ platforms:
# since we also need to use different OS users to run the tests because of how molecule operates,
# the VM names must be predictable by OS user (to clean up canceled runs)
- name: ${USER}
box: ${MOLECULE_DISTRO}
box: generic/${MOLECULE_DISTRO}
memory: 1024
cpus: 2
provisioner:
@@ -20,10 +20,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
# Workaround for https://github.com/ansible-community/molecule-plugins/issues/301
library: "${MOLECULE_PROJECT_DIRECTORY}/plugins/modules:/usr/share/ansible:${MOLECULE_VAGRANT_PLUGIN_DIR}"
inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
env:
@@ -36,7 +33,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -52,7 +48,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
@@ -4,17 +4,11 @@
become: true
gather_facts: false
tasks:
- name: Change installation source
# temporary fix for https://github.com/lavabit/robox/issues/305
ansible.builtin.raw: echo "https://ftp.eu.openbsd.org/pub/OpenBSD" > /etc/installurl
changed_when: false
when: lookup('env', 'MOLECULE_DISTRO') == 'generic/openbsd7'
- name: Install python
# BSDs are special for Ansible - https://docs.ansible.com/ansible/latest/os_guide/intro_bsd.html
ansible.builtin.raw: pkg_add -I python%3.11
ansible.builtin.raw: pkg_add python%3.10
changed_when: false
when: lookup('env', 'MOLECULE_DISTRO') == 'generic/openbsd7'
when: lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
hosts: all
@@ -24,6 +18,12 @@
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
tasks:
- name: Created needed directory
ansible.builtin.file:
path: /var/run/sshd
state: directory
mode: "0755"
- name: Create ssh host keys # noqa ignore-errors
ansible.builtin.command: ssh-keygen -A
when: not ((ansible_facts.os_family in ['Oracle Linux', 'RedHat']) and ansible_facts.distribution_major_version < '7')
@@ -9,7 +9,7 @@
dest: /usr/bin/type
state: hard
mode: "0770"
when: lookup('env', 'MOLECULE_DISTRO') == 'generic/openbsd7'
when: lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'
- name: Verify
hosts: localhost
@@ -36,7 +36,7 @@
ansible.builtin.command: >
docker run --rm
--volume {{ molecule_ephemeral_directory }}:{{ molecule_ephemeral_directory }}
--volume ./waivers_{{ lookup('env', 'MOLECULE_DISTRO') | regex_replace('^.*/', '') }}.yaml:/waivers.yaml
--volume ./waivers_{{ lookup('env', 'MOLECULE_DISTRO') }}.yaml:/waivers.yaml
docker.io/cincproject/auditor exec
--ssh-config-file={{ molecule_ephemeral_directory }}/ssh-config
-t ssh://{{ lookup('env', 'USER') }}
@@ -0,0 +1,3 @@
sshd-45:
run: false
justification: "PrintLastLog is broken on FreeBSD. see: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=209441"
@@ -0,0 +1,3 @@
sshd-45:
run: false
justification: "PrintLastLog is broken on FreeBSD. see: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=209441"
@@ -21,7 +21,7 @@
- root
network_ipv6_enable: true
ssh_allow_tcp_forwarding: "yes"
ssh_gateway_ports: "clientspecified"
ssh_gateway_ports: true
ssh_allow_agent_forwarding: true
ssh_server_permit_environment_vars: "yes"
ssh_server_accept_env_vars: PWD HTTP_PROXY
@@ -88,8 +88,9 @@
- aes192-ctr
- aes128-ctr
- aes256-cbc
# these should not be set in the final sshd_config
ssh_kex: false
ssh_kex:
- diffie-hellman-group-exchange-sha256
- diffie-hellman-group-exchange-sha1
ssh_custom_options:
- Include /etc/ssh/ssh_config.d/*
sshd_custom_options:
@@ -17,8 +17,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer
inject_facts_as_vars: false
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -29,7 +28,6 @@ scenario:
- prepare
check_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- create
- prepare
@@ -45,7 +43,6 @@ scenario:
- destroy
test_sequence:
- dependency
- verify ../shared/prerequisites.yml
- destroy
- syntax
- create
@@ -53,4 +50,5 @@ scenario:
- check
- converge
- idempotence
- verify
- destroy
+18 -20
View File
@@ -12,32 +12,27 @@
ansible_python_interpreter: /usr/bin/python3
when: ansible_facts.distribution == 'Fedora'
- name: Install dnf packages # noqa ignore-errors
ansible.builtin.dnf:
- name: Install packages # noqa ignore-errors
ansible.builtin.yum:
name:
- openssh-clients
- openssh-server
state: present
update_cache: true
ignore_errors: true
- name: Install libselinux-python # noqa ignore-errors
ansible.builtin.dnf:
name:
- libselinux-python
state: present
update_cache: true
ignore_errors: true
- name: Install procps-ng # noqa ignore-errors
- name: Install packages # noqa ignore-errors
ansible.builtin.dnf:
name:
- openssh-clients
- openssh-server
- procps-ng
state: present
update_cache: true
ignore_errors: true
- name: Install apt packages # noqa ignore-errors
- name: Install packages # noqa ignore-errors
ansible.builtin.apt:
name:
- openssh-client
@@ -52,7 +47,7 @@
changed_when: false
when: ansible_facts.os_family == 'Suse'
- name: Install packages on SuSE
- name: Install packages
community.general.zypper:
name:
- openssh
@@ -67,14 +62,17 @@
update_cache: true
when: ansible_facts.os_family == 'Archlinux'
- name: Install required tools on Alpine
community.general.apk:
name:
- openssh
state: present
update_cache: true
when: ansible_facts.os_family == 'Alpine'
- name: Created needed directory
ansible.builtin.file:
path: /var/run/sshd
state: directory
mode: "0755"
- name: Create ssh host keys # noqa ignore-errors no-changed-when
- name: Create ssh host keys # noqa ignore-errors
ansible.builtin.command: ssh-keygen -A
when: not ((ansible_facts.os_family in ['Oracle Linux', 'RedHat']) and ansible_facts.distribution_major_version < '7')
or ansible_facts.distribution == "Fedora"
or ansible_facts.distribution == "Amazon"
or ansible_facts.os_family == "Suse"
changed_when: false
ignore_errors: true
@@ -1,3 +0,0 @@
unrelated:
run: false
justification: "cinc-auditor needs at least one waived control"
@@ -1,3 +0,0 @@
unrelated:
run: false
justification: "cinc-auditor needs at least one waived control"
@@ -1,3 +0,0 @@
unrelated:
run: false
justification: "cinc-auditor needs at least one waived control"
@@ -1,3 +0,0 @@
unrelated:
run: false
justification: "cinc-auditor needs at least one waived control"
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:best-practices",
"config:base",
":gitSignOff"
],
"dependencyDashboard": true,
-1
View File
@@ -1 +0,0 @@
molecule-plugins[vagrant]==25.8.12
+8 -7
View File
@@ -1,7 +1,8 @@
molecule==26.4.0
molecule-plugins[docker]==25.8.12
ansible-core==2.20.5
docker==7.1.0
jmespath==1.1.0
aar-doc==2.3.0
passlib==1.7.4
molecule
molecule-plugins[docker]
yamllint
ansible-core==2.16.5
ansible-lint
docker
flake8
jmespath
+11 -11
View File
@@ -24,19 +24,20 @@ Further information is available at [Deutsche Telekom (German)](http://www.telek
<!-- BEGIN_ANSIBLE_DOCS -->
## Supported Operating Systems
- EL
- 8, 9, 10
- 7, 8, 9
- Ubuntu
- jammy, noble
- bionic, focal, jammy
- Debian
- trixie, bookworm, bullseye
- bullseye, buster
- Amazon
- opensuse
## Role Variables
- `mysql_daemon_enabled`
- Default: `True`
- Default: `true`
- Description: Whether to enable the MySQL-service so it starts on boot
- Type: bool
- Required: no
@@ -51,7 +52,7 @@ Further information is available at [Deutsche Telekom (German)](http://www.telek
- Type: int
- Required: no
- `mysql_hardening_enabled`
- Default: `True`
- Default: `true`
- Description: Whether to run the hardening
- Type: bool
- Required: no
@@ -86,12 +87,12 @@ Further information is available at [Deutsche Telekom (German)](http://www.telek
- Type: int
- Required: no
- `mysql_hardening_restart_mysql`
- Default: `True`
- Default: `true`
- Description: Restart mysql after running this role
- Type: bool
- Required: no
- `mysql_hardening_skip_grant_tables:`
- Default: `False`
- Default: `false`
- Description: [skip-grant-tables](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-grant-tables)
- Type: bool
- Required: no
@@ -101,17 +102,17 @@ Further information is available at [Deutsche Telekom (German)](http://www.telek
- Type: int
- Required: no
- `mysql_remove_anonymous_users`
- Default: `True`
- Default: `true`
- Description: Set to `false` to keep users without authentication
- Type: bool
- Required: no
- `mysql_remove_remote_root`
- Default: `True`
- Default: `true`
- Description: If `true`, root can only connect from localhost. Set to `false` to not remove remote root users.
- Type: bool
- Required: no
- `mysql_remove_test_database`
- Default: `True`
- Default: `true`
- Description: Set to `false` to keep the test database
- Type: bool
- Required: no
@@ -134,7 +135,6 @@ None.
```
- hosts: all
become: true
roles:
- name: devsec.hardening.mysql_hardening
```
+4 -4
View File
@@ -8,18 +8,18 @@ galaxy_info:
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- "10"
- name: Ubuntu
versions:
- bionic
- focal
- jammy
- noble
- name: Debian
versions:
- trixie
- bookworm
- bullseye
- buster
- name: Amazon
- name: opensuse
galaxy_tags:
+1 -1
View File
@@ -14,7 +14,7 @@
state: directory
owner: "{{ mysql_hardening_user }}"
group: "{{ mysql_hardening_user }}"
mode: '{{ mysql_hardening_datadir_permissions | default("0750") }}'
mode: "0750"
when: item is defined and item != ""
loop:
- "{{ mysql_settings.settings.datadir }}"
+2 -2
View File
@@ -39,13 +39,13 @@
when: not mysql_distribution is defined
- name: Check which MySQL/MariaDB version is used
ansible.mysql.mysql_info:
community.mysql.mysql_info:
filter: version
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
register: mysql_version
- name: Check MySQL/MariaDB settings
ansible.mysql.mysql_info:
community.mysql.mysql_info:
filter: settings
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
register: mysql_settings
@@ -5,7 +5,7 @@
when: mysql_root_password == '-----====>SetR00tPa$$wordH3r3!!!<====-----'
- name: Ensure that the root password is present
ansible.mysql.mysql_user:
community.mysql.mysql_user:
name: root
host_all: true
password: "{{ mysql_root_password | mandatory }}"
@@ -20,14 +20,14 @@
tags: my_cnf
- name: Ensure that the test database is absent
ansible.mysql.mysql_db:
community.mysql.mysql_db:
name: test
state: absent
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
when: mysql_remove_test_database
- name: Ensure that anonymous users are absent
ansible.mysql.mysql_user:
community.mysql.mysql_user:
name: ""
state: absent
host_all: true
@@ -35,7 +35,7 @@
when: mysql_remove_anonymous_users
- name: Ensure that root can only login from localhost
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
DELETE
FROM mysql.user
@@ -47,7 +47,7 @@
when: mysql_remove_remote_root
- name: Detect role support on MySQL version >= 5.7.6 or Mariadb version >= 10.4.0
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'
@@ -57,7 +57,7 @@
check_mode: false
- name: Get all users that have no authentication_string on MySQL version >= 5.7.6 or Mariadb version >= 10.4.0
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
SELECT CONCAT(QUOTE(USER), '@', QUOTE(HOST)) AS user
FROM mysql.user
@@ -76,7 +76,7 @@
is version('10.4.0', '>='))
- name: Get all users that have no password or authentication_string on MySQL version < 5.7.6 or Mariadb version < 10.4.0
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query: >
SELECT CONCAT(QUOTE(USER), '@', QUOTE(HOST)) AS user
FROM mysql.user
@@ -97,7 +97,7 @@
version('10.4.0', '<'))
- name: Ensure that there are no users without password or authentication_string
ansible.mysql.mysql_query:
community.mysql.mysql_query:
query:
- DROP USER {{ item.user }}
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
-2
View File
@@ -6,7 +6,5 @@ mysql_hardening_mysql_confd_dir: '/etc/my.cnf.d'
mysql_cnf_owner: 'root' # owner of /etc/my.cnf.d/*.cnf files
mysql_cnf_group: 'mysql' # owner of /etc/my.cnf.d/*.cnf files
mysql_hardening_datadir_permissions: "0700"
mysql_hardening_group: 'mysql'
login_unix_socket: '/run/mysql/mysql.sock'
+7 -7
View File
@@ -17,20 +17,21 @@ It works with the following nginx-roles, including, but not limited to:
<!-- BEGIN_ANSIBLE_DOCS -->
## Supported Operating Systems
- EL
- 8, 9, 10
- 7, 8, 9
- Ubuntu
- jammy, noble, resolute
- bionic, focal, jammy
- Debian
- trixie, bookworm, bullseye
- buster, bullseye
- Amazon
## Role Variables
- `nginx_add_header`
- Default: `['X-Frame-Options SAMEORIGIN', 'X-Content-Type-Options nosniff', 'X-XSS-Protection "1; mode=block"', 'Content-Security-Policy \\"script-src \'self\'; object-src \'self\'\\"']`
- Default: `["X-Frame-Options SAMEORIGIN", "X-Content-Type-Options nosniff", "X-XSS-Protection \"1; mode=block\"", "Content-Security-Policy \\\"script-src 'self'; object-src 'self'\\\""]`
- Description: Adds the specified field to a response header provided that the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307. See [nginx_add_header](http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header)
- Type: list of ''
- Type: list
- Required: no
- `nginx_client_body_buffer_size`
- Default: `1k`
@@ -103,7 +104,7 @@ It works with the following nginx-roles, including, but not limited to:
- Type: str
- Required: no
- `nginx_remove_default_site`
- Default: `True`
- Default: `true`
- Description: Disables the default site. Set to false to enable the default site in nginx.
- Type: bool
- Required: no
@@ -141,7 +142,6 @@ None.
```
- hosts: all
become: true
roles:
- name: devsec.hardening.nginx_hardening
```
+4 -5
View File
@@ -8,18 +8,17 @@ galaxy_info:
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- "10"
- name: Ubuntu
versions:
- bionic
- focal
- jammy
- noble
- resolute
- name: Debian
versions:
- trixie
- bookworm
- buster
- bullseye
- name: Amazon
galaxy_tags:
+86 -98
View File
@@ -94,18 +94,6 @@ We are setting this sysctl to a default of `32`, some systems only support small
vm.mmap_rnd_bits: 16
```
### password expiry and SSH key based logins
With default PAM configuration setting a password expiry for users will also block SSH key logins after the password has expired.
We have added a flag for PAM to ignore the expiry if SSH keys or other login mechanisms are used.
If you choose to use your own PAM configuration please adjust it accordingly to contain `no_pass_expiry` in the `account` stage for the `pam_unix.so` module.
A valid example would look like this:
```text
account required pam_unix.so no_pass_expiry
```
## Testing with inspec
If you're using inspec to test your machines after applying this role, please make sure to add the connecting user to the `os_ignore_users`-variable.
@@ -157,12 +145,13 @@ This role is mostly based on guides by:
<!-- BEGIN_ANSIBLE_DOCS -->
## Supported Operating Systems
- EL
- 8, 9, 10
- 7, 8, 9
- Ubuntu
- jammy, noble, resolute
- bionic, focal, jammy
- Debian
- trixie, bookworm, bullseye
- buster, bullseye
- Amazon
- Fedora
- ArchLinux
@@ -172,7 +161,7 @@ This role is mostly based on guides by:
## Role Variables
- `os_apt_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring apt.
- Type: bool
- Required: no
@@ -202,7 +191,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_auditd_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring auditd.
- Type: bool
- Required: no
@@ -231,16 +220,6 @@ This role is mostly based on guides by:
- Description: Defines the behaviour of auditd when its log file is filled up. Possible other values are described in the auditd.conf man page. The most common alternative to the default may be `rotate`.
- Type: str
- Required: no
- `os_auditd_name_format`
- Default: `NONE`
- Description: This keyword specifies how computer node names are inserted into the audit event stream.
- Type: str
- Required: no
- Choices:
- NONE
- hostname
- fqd
- numeric
- `os_auditd_num_logs`
- Default: `5`
- Description: This keyword specifies the number of log files to keep if `rotate` is given as the max_log_file_action. The value given must be numeric.
@@ -257,7 +236,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_auth_allow_homeless`
- Default: `False`
- Default: `false`
- Description: true if to allow users without home to login.
- Type: bool
- Required: no
@@ -277,12 +256,12 @@ This role is mostly based on guides by:
- Type: int
- Required: no
- `os_auth_pam_oddjob_mkhomedir`
- Default: `False`
- Default: `false`
- Description: Enables automatic homedir e.g. in FreeIPA environments
- Type: bool
- Required: no
- `os_auth_pam_passwdqc_enable`
- Default: `True`
- Default: `true`
- Description: true if you want to use strong password checking in PAM using passwdqc.
- Type: bool
- Required: no
@@ -322,9 +301,9 @@ This role is mostly based on guides by:
- Type: int
- Required: no
- `os_auth_root_ttys`
- Default: `['console', 'tty1', 'tty2', 'tty3', 'tty4', 'tty5', 'tty6']`
- Default: `["console", "tty1", "tty2", "tty3", "tty4", "tty5", "tty6"]`
- Description: A list of TTYs, from which root can log in, see `man securetty` for reference
- Type: list of ''
- Type: list
- Required: no
- `os_auth_sub_gid_count`
- Default: `65536`
@@ -377,67 +356,72 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_chmod_home_folders`
- Default: `True`
- Default: `true`
- Description: Set to `false` to disable "chmod 700" of home folders for regular users
- Type: bool
- Required: no
- `os_chmod_rootuser_home_folder`
- Default: `True`
- Default: `true`
- Description: Set to `false` to disable "chmod 700" of root's home folder
- Type: bool
- Required: no
- `os_cron_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring cron.
- Type: bool
- Required: no
- `os_ctrlaltdel_disabled`
- Default: `False`
- Default: `false`
- Description: Set to true to disable ctrl-alt-delete key combination.
- Type: bool
- Required: no
- `os_desktop_enable`
- Default: `false`
- Description: true if this is a desktop system, ie Xorg, KDE/GNOME/Unity/etc.
- Type: bool
- Required: no
- `os_env_extra_user_paths`
- Default: `[]`
- Default: `"[]"`
- Description: Specify additional paths that should be checked for binaries where access will be minimized
- Type: list of ''
- Type: list
- Required: no
- `os_env_user_paths`
- Default: `['/usr/local/sbin', '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', '/bin']`
- Default: `["/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin"]`
- Description: Specify paths that should be checked for binaries where access will be minimized
- Type: list of ''
- Type: list
- Required: no
- `os_filesystem_whitelist`
- Default: `[]`
- Default: `"[]"`
- Description: A list of filesystems that should not be disabled
- Type: list of ''
- Type: list
- Required: no
- `os_hardening_enabled`
- Default: `True`
- Default: `true`
- Description: Whether to run the hardening
- Type: bool
- Required: no
- `os_ignore_home_folder_users`
- Default: `[]`
- Default: `"[]"`
- Description: Specify user accounts, whose home folders shouldn't be chmodded to 700 when "os_chmod_home_folders" is enabled.
- Type: list of ''
- Type: list
- Required: no
- `os_ignore_users`
- Default: `['vagrant', 'kitchen']`
- Default: `["vagrant", "kitchen"]`
- Description: Specify system accounts whose login should not be disabled and password not changed
- Type: list of ''
- Type: list
- Required: no
- `os_limits_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring limits.
- Type: bool
- Required: no
- `os_login_defs_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring login_defs for newly created users.
- Type: bool
- Required: no
- `os_minimize_access_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring minimize_access.
- Type: bool
- Required: no
@@ -452,7 +436,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_boot_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /boot mountpoint
- Type: bool
- Required: no
@@ -487,7 +471,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_dev_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to ignore /dev mountpoint
- Type: bool
- Required: no
@@ -517,7 +501,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_dev_shm_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to ignore /dev/shm mountpoint
- Type: bool
- Required: no
@@ -557,7 +541,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_home_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /home mountpoint
- Type: bool
- Required: no
@@ -592,7 +576,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_run_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to ignore /run mountpoint
- Type: bool
- Required: no
@@ -627,7 +611,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_tmp_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /tmp mountpoint
- Type: bool
- Required: no
@@ -662,7 +646,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_var_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /var mountpoint
- Type: bool
- Required: no
@@ -682,7 +666,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_var_log_audit_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /var/log/audit mountpoint
- Type: bool
- Required: no
@@ -717,7 +701,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_var_log_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /var/log mountpoint
- Type: bool
- Required: no
@@ -767,7 +751,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_mnt_var_tmp_enabled`
- Default: `False`
- Default: `false`
- Description: Set to true to configure /var/tmp mountpoint
- Type: bool
- Required: no
@@ -792,47 +776,47 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `os_modprobe_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring modprobe.
- Type: bool
- Required: no
- `os_netrc_enabled`
- Default: `True`
- Default: `true`
- Description: Configure filesystem for existence of .netrc file in homedir
- Type: bool
- Required: no
- `os_netrc_whitelist_user`
- Default: `[]`
- Default: `"[]"`
- Description: Add list of user to allow creation of .netrc in users homedir
- Type: list of ''
- Type: list
- Required: no
- `os_pam_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring pam.
- Type: bool
- Required: no
- `os_profile_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring profile.
- Type: bool
- Required: no
- `os_remove_additional_root_users`
- Default: `False`
- Default: `false`
- Description: When enabled and there are multiple users with UID=0, only "root" will be kept. Others will be deleted.
- Type: bool
- Required: no
- `os_rhosts_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring rhosts.
- Type: bool
- Required: no
- `os_rootuser_pw_ageing`
- Default: `False`
- Default: `false`
- Description: Set to true to enforce password age settings for root user(s)
- Type: bool
- Required: no
- `os_securetty_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring securetty.
- Type: bool
- Required: no
@@ -842,57 +826,62 @@ This role is mostly based on guides by:
- Type: int
- Required: no
- `os_security_init_prompt`
- Default: `True`
- Default: `true`
- Description: The PROMPT option provides console users the ability to interactively boot the system and select which services to start on boot.
- Type: bool
- Required: no
- `os_security_init_single`
- Default: `False`
- Default: `false`
- Description: Single-user mode is intended as a system recovery method, providing a single user root access to the system by providing a boot option at startup. By default, no authentication is performed if single-user mode is selected. To require entry of the root password even if the system is started in single-user mode, set this to false
- Type: bool
- Required: no
- `os_security_kernel_enable_core_dump`
- Default: `False`
- Default: `false`
- Description: kernel is crashing or otherwise misbehaving and a kernel core dump is created.
- Type: bool
- Required: no
- `os_security_kernel_enable_module_loading`
- Default: `true`
- Description: true if you want to allowed to change kernel modules once the system is running (eg `modprobe`, `rmmod`). WARNING - Rebuilding initramfs is deprecated and will be removed in the next major release. For more information take a look at this issue <https://github.com/dev-sec/ansible-collection-hardening/pull/591>
- Type: bool
- Required: no
- `os_security_packages_clean`
- Default: `True`
- Default: `true`
- Description: removes packages with known issues. See section packages.
- Type: bool
- Required: no
- `os_security_packages_list`
- Default: `['xinetd', 'inetd', 'ypserv', 'telnet-server', 'rsh-server', 'prelink']`
- Default: `["xinetd", "inetd", "ypserv", "telnet-server", "rsh-server", "prelink"]`
- Description: List of deprecated or insecure packages to remove
- Type: list of ''
- Type: list
- Required: no
- `os_security_suid_sgid_blacklist`
- Default: `[]`
- Default: `"[]"`
- Description: a list of paths which should have their SUID/SGID bits removed.
- Type: list of ''
- Type: list
- Required: no
- `os_security_suid_sgid_enforce`
- Default: `True`
- Default: `true`
- Description: true if you want to reduce SUID/SGID bits. There is already a list of items which are searched for configured, but you can also add your own.
- Type: bool
- Required: no
- `os_security_suid_sgid_remove_from_unknown`
- Default: `False`
- Default: `false`
- Description: true if you want to remove SUID/SGID bits from any file, that is not explicitly configured in a `blacklist`. This will make every Ansible-run search through the mounted filesystems looking for SUID/SGID bits that are not configured in the default and user blacklist. If it finds an SUID/SGID bit, it will be removed, unless this file is in your `whitelist`.
- Type: bool
- Required: no
- `os_security_suid_sgid_whitelist`
- Default: `[]`
- Default: `"[]"`
- Description: a list of paths which should not have their SUID/SGID bits altered.
- Type: list of ''
- Type: list
- Required: no
- `os_security_users_allow`
- Default: `[]`
- Default: `"[]"`
- Description: list of things, that a user is allowed to do. May contain `change_user`.
- Type: list of ''
- Type: list
- Required: no
- `os_selinux_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring selinux.
- Type: bool
- Required: no
@@ -917,39 +906,39 @@ This role is mostly based on guides by:
- Type: int
- Required: no
- `os_sysctl_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring sysctl.
- Type: bool
- Required: no
- `os_unused_filesystems`
- Default: `['cramfs', 'freevxfs', 'jffs2', 'hfs', 'hfsplus', 'squashfs', 'udf', 'vfat', 'dccp', 'rds', 'sctp', 'tipc']`
- Default: `["cramfs", "freevxfs", "jffs2", "hfs", "hfsplus", "squashfs", "udf", "vfat", "dccp", "rds", "sctp", "tipc"]`
- Description: Disable this list of unused filesystems
- Type: list of ''
- Type: list
- Required: no
- `os_user_accounts_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring user_accounts.
- Type: bool
- Required: no
- `os_user_pw_ageing`
- Default: `True`
- Default: `true`
- Description: Set to false to disable password age enforcement on existing users
- Type: bool
- Required: no
- `os_users_without_password_ageing`
- Default: `[]`
- Default: `"[]"`
- Description: List of users, where password ageing should not be enforced even if "os_user_pw_ageing" is enabled
- Type: list of ''
- Type: list
- Required: no
- `os_yum_enabled`
- Default: `True`
- Default: `true`
- Description: Set to false to disable installing and configuring yum.
- Type: bool
- Required: no
- `os_yum_repo_file_whitelist`
- Default: `[]`
- Default: `"[]"`
- Description: List of yum repository files under /etc/yum.repos.d/ which should not be altered.
- Type: list of ''
- Type: list
- Required: no
- `proc_mnt_options`
- Default: `rw,nosuid,nodev,noexec,relatime`
@@ -987,7 +976,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `ufw_enable_ipv6`
- Default: `True`
- Default: `true`
- Description: Set to `true` to apply rules to support IPv6 (no means only IPv6 on loopback accepted).
- Type: bool
- Required: no
@@ -1007,7 +996,7 @@ This role is mostly based on guides by:
- Type: str
- Required: no
- `ufw_manage_defaults`
- Default: `True`
- Default: `true`
- Description: true means apply all settings with `ufw_` prefix.
- Type: bool
- Required: no
@@ -1020,7 +1009,6 @@ None.
```
- hosts: all
become: true
roles:
- name: devsec.hardening.os_hardening
```
+3 -2
View File
@@ -1,4 +1,5 @@
---
os_desktop_enable: false
os_env_user_paths: [/usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin]
os_env_extra_user_paths: []
os_auth_pw_max_age: 60
@@ -39,6 +40,7 @@ os_users_without_password_ageing: []
# Specify system accounts whose login should not be disabled and password not changed
os_ignore_users: [vagrant, kitchen]
os_security_kernel_enable_module_loading: true
os_security_kernel_enable_core_dump: false
os_security_suid_sgid_enforce: true
# User-defined blacklist and whitelist
@@ -146,7 +148,7 @@ sysctl_config:
# The PTRACE system is used for debugging. With it, a single user process
# can attach to any other dumpable process owned by the same user. In the
# case of malicious software, it is possible to use PTRACE to access
# credentials that exist in memory (reusing existing SSH connections,
# credentials that exist in memory (re-using existing SSH connections,
# extracting GPG agent information, etc).
#
# A PTRACE scope of "0" is the more permissive mode. A scope of "1" limits
@@ -348,7 +350,6 @@ os_auditd_disk_error_action: SUSPEND
os_auditd_action_mail_acct: root
os_auditd_log_group: root
os_auditd_num_logs: 5
os_auditd_name_format: NONE
# Set the SELinux state, which can be either disabled, permissive, or enforcing.
os_selinux_state: enforcing
-5
View File
@@ -27,8 +27,3 @@
path: "{{ item }}"
state: remounted
loop: "{{ mountpoints_changed }}"
- name: Restart journald
ansible.builtin.systemd:
name: systemd-journald.service
state: restarted
+11 -10
View File
@@ -4,6 +4,10 @@ argument_specs:
short_description: The main entry point for the os hardening role.
version_added: 8.8.0
options:
os_desktop_enable:
default: false
type: bool
description: true if this is a desktop system, ie Xorg, KDE/GNOME/Unity/etc.
os_env_user_paths:
default: [/usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin]
type: list
@@ -69,6 +73,13 @@ argument_specs:
default: '[]'
type: list
description: list of things, that a user is allowed to do. May contain `change_user`.
os_security_kernel_enable_module_loading:
default: true
type: bool
description: true if you want to allowed to change kernel modules once the
system is running (eg `modprobe`, `rmmod`). WARNING - Rebuilding initramfs
is deprecated and will be removed in the next major release. For more information
take a look at this issue <https://github.com/dev-sec/ansible-collection-hardening/pull/591>
os_security_kernel_enable_core_dump:
default: false
type: bool
@@ -207,16 +218,6 @@ argument_specs:
description: This keyword specifies the maximum file size in megabytes. When
this limit is reached, it will trigger a configurable action. The value
given must be numeric.
os_auditd_name_format:
default: NONE
type: str
description: This keyword specifies how computer node names are inserted
into the audit event stream.
choices:
- NONE
- hostname
- fqd
- numeric
os_auditd_num_logs:
default: 5
type: int
+5 -6
View File
@@ -4,22 +4,21 @@ galaxy_info:
description: This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
company: Hardening Framework Team
license: Apache License 2.0
min_ansible_version: "2.16"
min_ansible_version: "2.11"
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- "10"
- name: Ubuntu
versions:
- bionic
- focal
- jammy
- noble
- resolute
- name: Debian
versions:
- trixie
- bookworm
- buster
- bullseye
- name: Amazon
- name: Fedora
-12
View File
@@ -16,15 +16,3 @@
- Restart auditd via service
- Restart auditd via systemd
tags: auditd
- name: Disable systemd-journald.audit
when:
- ansible_facts.os_family != 'Suse' # socket doesn't seem to exist on suse
ansible.builtin.systemd:
name: systemd-journald-audit.socket
state: stopped
enabled: false
masked: true
notify:
- Restart journald
tags: auditd
+1 -1
View File
@@ -4,4 +4,4 @@
name: ctrl-alt-del.target
masked: true
daemon_reload: true
when: ansible_facts.service_mgr == "systemd"
when: ansible_service_mgr == "systemd"
+10
View File
@@ -123,3 +123,13 @@
when:
- ansible_facts.selinux.status == 'enabled'
- os_selinux_enabled | bool
- name: Raise deprecation warning for initramfs tasks # noqa ignore-errors
ansible.builtin.fail:
msg: "WARNING: Rebuilding initramfs is deprecated and will be removed
in the next major release. For more information take a look at this issue:
https://github.com/dev-sec/ansible-collection-hardening/pull/591"
when:
- os_security_kernel_enable_module_loading
ignore_errors: true
tags: always
+3 -3
View File
@@ -37,7 +37,7 @@
group: root
mode: "0755"
state: directory
when: ansible_facts.service_mgr == "systemd"
when: ansible_service_mgr == "systemd"
- name: Create custom.conf for disabling coredumps
ansible.builtin.template:
@@ -46,7 +46,7 @@
owner: root
group: root
mode: "0644"
when: ansible_facts.service_mgr == "systemd"
when: ansible_service_mgr == "systemd"
notify: Reload systemd
- name: Enable coredumps
@@ -56,7 +56,7 @@
ansible.builtin.file:
path: /etc/systemd/coredump.conf.d
state: absent
when: ansible_facts.service_mgr == "systemd"
when: ansible_service_mgr == "systemd"
notify: Reload systemd
- name: Remove 10.hardcore.conf config file
+1 -1
View File
@@ -89,7 +89,7 @@
- name: Generate list of current available mounted filesystems on the system
ansible.builtin.set_fact:
mountpoints_list: "{{ ansible_facts.mounts | map(attribute='mount') | list }}"
mountpoints_list: "{{ ansible_mounts | map(attribute='mount') | list }}"
- name: Append special devices list to valid mountpoint list
ansible.builtin.set_fact:
@@ -13,7 +13,7 @@
- mount.enabled | bool
- mount.path in mountpoints_list
vars:
mountinfo: "{{ ansible_facts.mounts | selectattr('mount', 'equalto', mount.path) | list | first | default(None) }}"
mountinfo: "{{ ansible_mounts | selectattr('mount', 'equalto', mount.path) | list | first | default(None) }}"
notify: Remount filesystems
- name: "Check for existence of mount {{ mount.path }}"
+1 -1
View File
@@ -18,7 +18,7 @@
- name: Remove used filesystems from fs-list
ansible.builtin.set_fact:
os_unused_filesystems: "{{ os_unused_filesystems | difference(ansible_facts.mounts | map(attribute='fstype') | list) }}"
os_unused_filesystems: "{{ os_unused_filesystems | difference(ansible_mounts | map(attribute='fstype') | list) }}"
- name: Disable unused filesystems | os-10
ansible.builtin.template:
-18
View File
@@ -27,24 +27,6 @@
when:
- ansible_facts.os_family == 'RedHat'
- name: Allow Login with SSH Keys, when user password is expired
ansible.builtin.lineinfile:
path: /etc/pam.d/system-auth
backrefs: true
regexp: "^(account.*pam_unix.so(?!.*no_pass_expiry).*)$"
line: '\1 no_pass_expiry'
when:
- ansible_facts.os_family == 'Archlinux'
- name: Allow Login with SSH Keys, when user password is expired
ansible.builtin.lineinfile:
path: /etc/pam.d/common-account
backrefs: true
regexp: "^(account.*pam_unix.so(?!.*no_pass_expiry).*)$"
line: '\1 no_pass_expiry'
when:
- ansible_facts.os_family == 'Suse'
- name: NSA 2.3.3.5 Upgrade Password Hashing Algorithm to SHA-512
ansible.builtin.template:
src: etc/libuser.conf.j2
+1 -7
View File
@@ -3,6 +3,7 @@
ansible.builtin.apt:
name: libpam-passwdqc
state: present
update_cache: true
when:
- os_auth_pam_passwdqc_enable
@@ -117,10 +118,3 @@
state: absent
when:
- not os_auth_pam_passwdqc_enable
- name: Allow Login with SSH Keys, when user password is expired
ansible.builtin.lineinfile:
path: /etc/pam.d/common-account
backrefs: true
regexp: "^(account.*pam_unix.so(?!.*no_pass_expiry).*)$"
line: '\1 no_pass_expiry'
+1 -1
View File
@@ -1,6 +1,6 @@
---
- name: Install sssd-clients
ansible.builtin.dnf:
ansible.builtin.yum:
name: sssd-client
state: present
when:
+50 -17
View File
@@ -1,4 +1,14 @@
---
- name: Protect sysctl.conf
ansible.builtin.file:
path: /etc/sysctl.conf
owner: root
group: root
mode: "0440"
state: touch
modification_time: preserve
access_time: preserve
- name: Set Daemon umask, do config for rhel-family | NSA 2.2.4.1
ansible.builtin.template:
src: etc/sysconfig/rhel_sysconfig_init.j2
@@ -8,34 +18,57 @@
mode: "0544"
when: ansible_facts.os_family == 'RedHat'
- name: Install initramfs-tools
ansible.builtin.apt:
name: initramfs-tools
state: present
update_cache: true
when:
- ansible_facts.os_family == 'Debian'
- os_security_kernel_enable_module_loading
- name: Rebuild initramfs with starting pack of modules, if module loading at runtime is disabled
ansible.builtin.template:
src: etc/initramfs-tools/modules.j2
dest: /etc/initramfs-tools/modules
owner: root
group: root
mode: "0440"
notify:
- Update-initramfs
when:
- ansible_facts.os_family == 'Debian'
- os_security_kernel_enable_module_loading
register: initramfs
- name: Change sysctls
when: ansible_facts.virtualization_type not in ['docker', 'lxc', 'openvz']
when: ansible_virtualization_type not in ['docker', 'lxc', 'openvz']
block:
- name: Protect sysctl.conf
ansible.builtin.file:
path: /etc/sysctl.d/90-dev-sec.conf
owner: root
group: root
mode: "0440"
state: touch
modification_time: preserve
access_time: preserve
- name: Create a combined sysctl-dict if os-dependent sysctls are defined
ansible.builtin.set_fact:
sysctl_config: "{{ sysctl_config | combine(sysctl_custom_config) }}"
when: sysctl_custom_config | default()
# sysctl_rhel_config is kept for backwards-compatibility. use sysctl_custom_config instead
- name: Create a combined sysctl-dict if os-dependent sysctls are defined
ansible.builtin.set_fact:
sysctl_config: "{{ sysctl_config | combine(sysctl_rhel_config) }}"
when: sysctl_rhel_config | default()
- name: Create a combined sysctl-dict if overwrites are defined
ansible.builtin.set_fact:
sysctl_config: "{{ sysctl_config | combine(sysctl_overwrite) }}"
when: sysctl_overwrite | default()
- name: Change various sysctl-settings, look at the sysctl-vars file for documentation
ansible.posix.sysctl:
name: "{{ item.key }}"
value: "{{ item.value }}"
sysctl_set: true
sysctl_file: /etc/sysctl.d/90-dev-sec.conf
state: present
reload: true
ignoreerrors: true
# sysctl_rhel_config is kept for backwards-compatibility. use sysctl_custom_config instead
# combines all sysctl-dicts into one, adds empty dicts if they are not defined
with_dict: "{{ ((sysctl_config
| combine(sysctl_custom_config | default({})))
| combine(sysctl_rhel_config | default({})))
| combine(sysctl_overwrite | default({})) }}"
with_dict: "{{ sysctl_config }}"
when: item.key not in sysctl_unsupported_entries | default()
- name: Apply ufw defaults
+17 -21
View File
@@ -4,28 +4,28 @@
database: passwd
# creates a dict for each user containing UID/HOMEDIR etc...
# skip this task if getent was run before without specifying a key (single entry)
when: ansible_facts.getent_passwd is undefined or
ansible_facts.getent_passwd | length <= 1
when: getent_passwd is undefined or
getent_passwd | length <= 1
- name: Read local linux shadow database
ansible.builtin.getent:
database: shadow
- name: Extract system accounts from local user database
loop: "{{ ansible_facts.getent_passwd.keys() | list }}"
loop: "{{ getent_passwd.keys() | list }}"
when:
- ansible_facts.getent_passwd[item][1]|int > 0
- ansible_facts.getent_passwd[item][1]|int <= os_auth_sys_uid_max|int
- getent_passwd[item][1]|int > 0
- getent_passwd[item][1]|int <= os_auth_sys_uid_max|int
- item is not in os_always_ignore_users # skip users from "os_always_ignore_users" list (taken from role "vars")
- item is not in os_ignore_users # skip users from "os_ignore_users" list (taken from role "defaults")
ansible.builtin.set_fact:
system_users: "{{ system_users | default([]) + [item] }}"
- name: Extract regular (non-system, non-root) accounts from local user database
loop: "{{ ansible_facts.getent_passwd.keys() | list }}"
loop: "{{ getent_passwd.keys() | list }}"
when:
- ansible_facts.getent_passwd[item][1]|int >= os_auth_uid_min|int
- ansible_facts.getent_passwd[item][1]|int <= os_auth_uid_max|int
- getent_passwd[item][1]|int >= os_auth_uid_min|int
- getent_passwd[item][1]|int <= os_auth_uid_max|int
- item is not in os_always_ignore_users # skip users from "os_always_ignore_users" list (taken from role "vars")
- item is not in os_ignore_users # skip users from "os_ignore_users" list (taken from role "defaults")
ansible.builtin.set_fact:
@@ -36,20 +36,18 @@
name: "{{ item }}"
password_expire_min: "{{ os_auth_pw_min_age }}"
password_expire_max: "{{ os_auth_pw_max_age }}"
password_expire_warn: "{{ os_auth_pw_warn_age }}"
loop: "{{ regular_users }}"
when:
- os_user_pw_ageing
- regular_users is defined and (regular_users | length > 0)
- item not in os_users_without_password_ageing
# password hashes with illegal characters like "*" or "!" are unusable (locked) and don't need to age
- ansible_facts.getent_shadow[item][0] is not match("\*")
- ansible_facts.getent_shadow[item][0] is not match("\!")
- getent_shadow[item][0] is not match("\*") # password hashes containing illegal characters like "*" are unusable (locked) and don't need to age
- getent_shadow[item][0] is not match("\!") # password hashes containing illegal characters like "!" are unusable (locked) and don't need to age
- name: Extract root account(s) from local user database
loop: "{{ ansible_facts.getent_passwd.keys() | list }}"
loop: "{{ getent_passwd.keys() | list }}"
when:
- ansible_facts.getent_passwd[item][1]|int == 0
- getent_passwd[item][1]|int == 0
ansible.builtin.set_fact:
root_users: "{{ root_users | default([]) + [item] }}"
@@ -57,7 +55,7 @@
ansible.builtin.file:
mode: "0700"
owner: "{{ item }}"
path: "{{ ansible_facts.getent_passwd[item][4] }}"
path: "{{ getent_passwd[item][4] }}"
state: directory
loop: "{{ root_users }}"
when:
@@ -68,13 +66,11 @@
name: "{{ item }}"
password_expire_min: "{{ os_auth_pw_min_age }}"
password_expire_max: "{{ os_auth_pw_max_age }}"
password_expire_warn: "{{ os_auth_pw_warn_age }}"
loop: "{{ root_users }}"
when:
- os_rootuser_pw_ageing | bool
# password hashes with illegal characters like "*" or "!" are unusable (locked) and don't need to age
- ansible_facts.getent_shadow[item][0] is not match("\*")
- ansible_facts.getent_shadow[item][0] is not match("\!")
- getent_shadow[item][0] is not match("\*") # password hashes containing illegal characters like "*" are unusable (locked) and don't need to age
- getent_shadow[item][0] is not match("\!") # password hashes containing illegal characters like "!" are unusable (locked) and don't need to age
- name: Remove additional users with UID=0 ("root" user is not touched)
ansible.builtin.user:
@@ -100,13 +96,13 @@
createhome: false
loop: "{{ system_users }}"
when:
- ansible_facts.getent_shadow[item][0] is not match("\!") # password hashes containing illegal characters like "!" are unusable already (locked)
- getent_shadow[item][0] is not match("\!") # password hashes containing illegal characters like "!" are unusable already (locked)
- name: Limit access to home directories of regular (non-system, non-root) accounts
ansible.builtin.file:
mode: "0700"
owner: "{{ item }}"
path: "{{ ansible_facts.getent_passwd[item][4] }}"
path: "{{ getent_passwd[item][4] }}"
state: directory
loop: "{{ regular_users }}"
when:
+1 -1
View File
@@ -45,7 +45,7 @@
- /etc/yum/pluginconf.d/rhnplugin.conf
- name: Remove deprecated or insecure packages | package-01 - package-09
ansible.builtin.dnf:
ansible.builtin.yum:
name: "{{ os_security_packages_list }}"
state: absent
when: os_security_packages_clean | bool
@@ -11,7 +11,7 @@ freq = {{ os_auditd_freq }}
num_logs = {{ os_auditd_num_logs }}
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = {{ os_auditd_name_format }}
name_format = NONE
max_log_file = {{ os_auditd_max_log_file }}
max_log_file_action = {{ os_auditd_max_log_file_action }}
space_left = {{ os_auditd_space_left }}
@@ -0,0 +1,113 @@
{{ ansible_managed | comment }}
# Generated by Ansible role {{ ansible_role_name }}
# This file contains the names of kernel modules that should be loaded at boot time, one per line. Lines beginning with "#" are ignored.
#
# A list of all available kernel modules kann be found with `find /lib/modules/$(uname -r)/kernel/`
# We will sort by folder.
# Arch
# ----
#
# Modules for certains builds, contains support modules and some CPU-specific optimizations.
{% if ansible_facts.architecture == 'x86_64' %}
# Optimize for x86_64 cryptographic features
twofish-x86_64-3way
twofish-x86_64
aes-x86_64
salsa20-x86_64
blowfish-x86_64
{% endif %}
{% if 'AuthenticAMD' in ansible_facts.processor %}
# AMD-specific optimizations
kvm-amd
{% else %}
# Intel-specific optimizations
ghash-clmulni-intel
aesni-intel
kvm-intel
{% endif %}
kvm
# Crypto
# ------
# Some core modules which comprise strong cryptography.
blowfish_common
blowfish_generic
ctr
cts
lrw
lzo
rmd160
rmd256
rmd320
serpent
sha512_generic
twofish_common
twofish_generic
xts
zlib
# Drivers
# -------
# Basics
lp
rtc
loop
# Filesystems
ext2
btrfs
{% if os_desktop_enable %}
# Desktop
psmouse
snd
snd_ac97_codec
snd_intel8x0
snd_page_alloc
snd_pcm
snd_timer
soundcore
usbhid
{% endif %}
# Lib
# ---
xz
# Net
# ---
# All packets needed for netfilter rules (ie iptables, ebtables).
ip_tables
x_tables
iptable_filter
iptable_nat
# Targets
ipt_LOG
ipt_REJECT
# Modules
xt_connlimit
xt_tcpudp
xt_recent
xt_limit
xt_conntrack
nf_conntrack
nf_conntrack_ipv4
nf_defrag_ipv4
xt_state
nf_nat
# Addons
xt_pknock
@@ -5,7 +5,7 @@
#
# Three items must be defined: `MAIL_DIR`, `ENV_SUPATH`, and `ENV_PATH`. If unspecified, some arbitrary (and possibly incorrect) value will be assumed. All other items are optional - if not specified then the described action or option will be inhibited.
#
# Comment lines and blank lines are ignored.
# Comment lines (lines beginning with `#`) and blank lines are ignored.
#
#-- Modified for Linux. --marekm
@@ -35,7 +35,7 @@ FAILLOG_ENAB yes
# Enable display of unknown usernames when login failures are recorded.
#
# *WARNING*: Unknown usernames may become world readable. See 290803 and 298773 for details about how this could become a security concern
# *WARNING*: Unknown usernames may become world readable. See #290803 and #298773 for details about how this could become a security concern
LOG_UNKFAIL_ENAB no
# Enable logging of successful logins
@@ -56,7 +56,7 @@ SYSLOG_SG_ENAB yes
# If defined, login failures will be logged here in a utmp format last, when invoked as lastb, will read `/var/log/btmp`, so...
FTMP_FILE /var/log/btmp
# If defined, the command name to display when running "su -". For example, if this is defined as "su" then a "ps" will display the command is "-su". If not defined, then "ps" would display the name of the shell actually being run, e.g. something like "-sh".
# If defined, the command name to display when running "su -". For # example, if this is defined as "su" then a "ps" will display the command is "-su". If not defined, then "ps" would display the name of the shell actually being run, e.g. something like "-sh".
SU_NAME su
# If defined, file which inhibits all the usual chatter during the login sequence. If a full pathname, then hushed mode will be enabled if the user's name or shell are found in the file. If not a full pathname, then hushed mode will be enabled if the file exists in the user's home directory.
@@ -96,7 +96,7 @@ KILLCHAR 025
UMASK {{ os_env_umask }}
# Enable setting of the umask group bits to be the same as owner bits (examples: `022` -> `002`, `077` -> `007`) for non-root users, if the uid is the same as gid, and username is the same as the primary group name.
# If set to yes, userdel will remove the user's group if it contains no more members, and useradd will create by default a group with the name of the user.
# If set to yes, userdel will remove the user´s group if it contains no more members, and useradd will create by default a group with the name of the user.
USERGROUPS_ENAB yes
@@ -24,7 +24,7 @@ auth required pam_deny.so
{% if os_auth_retries|int > 0 %}
account required pam_faillock.so
{% endif %}
account required pam_unix.so no_pass_expiry
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
{% if (os_auth_pam_sssd_enable | bool) %}
@@ -1,9 +1,9 @@
{{ ansible_managed | comment }}
# Generated by Ansible role {{ ansible_role_name }}
# color => new RH6.0 boot-up
# verbose => old-style boot-up
# anything else => new style boot-up without ANSI colors or positioning
# color => new RH6.0 bootup
# verbose => old-style bootup
# anything else => new style bootup without ANSI colors or positioning
BOOTUP=color
# column to start "[ OK ]" label in
RES_COL=60
+88
View File
@@ -0,0 +1,88 @@
---
os_packages_pam_ccreds: pam_ccreds
os_nologin_shell_path: /sbin/nologin
# Different distros use different standards for /etc/shadow perms, e.g.
# RHEL derivatives use root:root 0000, whereas Debian-based use root:shadow 0640.
# You must provide key/value pairs for owner, group, and mode if overriding.
os_shadow_perms:
owner: root
group: root
mode: "0000"
os_passwd_perms:
owner: root
group: root
mode: "0644"
os_env_umask: "077"
os_auth_uid_min: 1000
os_auth_uid_max: 60000
os_auth_gid_min: 1000
os_auth_gid_max: 60000
os_auth_sys_uid_min: 201
os_auth_sys_uid_max: 999
os_auth_sys_gid_min: 201
os_auth_sys_gid_max: 999
os_auth_sub_uid_min: 100000
os_auth_sub_uid_max: 600100000
os_auth_sub_uid_count: 65536
os_auth_sub_gid_min: 100000
os_auth_sub_gid_max: 600100000
os_auth_sub_gid_count: 65536
os_auth_pam_sssd_enable: false
os_mnt_boot_dir_mode: '0700'
os_mnt_boot_group: 'root'
os_mnt_boot_owner: 'root'
os_mnt_dev_dir_mode: '0755'
os_mnt_dev_group: 'root'
os_mnt_dev_owner: 'root'
os_mnt_dev_shm_dir_mode: '1777'
os_mnt_dev_shm_group: 'root'
os_mnt_dev_shm_owner: 'root'
os_mnt_home_dir_mode: '0755'
os_mnt_home_group: 'root'
os_mnt_home_owner: 'root'
os_mnt_run_dir_mode: '0755'
os_mnt_run_group: 'root'
os_mnt_run_owner: 'root'
os_mnt_tmp_dir_mode: '1777'
os_mnt_tmp_group: 'root'
os_mnt_tmp_owner: 'root'
os_mnt_var_dir_mode: '0755'
os_mnt_var_group: 'root'
os_mnt_var_owner: 'root'
os_mnt_var_log_dir_mode: '0755'
os_mnt_var_log_group: 'root'
os_mnt_var_log_owner: 'root'
os_mnt_var_log_audit_dir_mode: '0700'
os_mnt_var_log_audit_group: 'root'
os_mnt_var_log_audit_owner: 'root'
os_mnt_var_tmp_dir_mode: '1777'
os_mnt_var_tmp_group: 'root'
os_mnt_var_tmp_owner: 'root'
# defaults for useradd
os_useradd_mail_dir: /var/spool/mail
os_useradd_create_home: true
modprobe_package: module-init-tools
auditd_package: audit
hidepid_option: "0" # allowed values: 0, 1, 2
sysctl_unsupported_entries:
- fs.protected_fifos
- fs.protected_regular
+1 -1
View File
@@ -669,7 +669,7 @@
- Make MaxAuthTries configurable [\#31](https://github.com/dev-sec/ansible-ssh-hardening/pull/31) ([rndmh3ro](https://github.com/rndmh3ro))
- Change oneliner if-statements to be more readable [\#30](https://github.com/dev-sec/ansible-ssh-hardening/pull/30) ([rndmh3ro](https://github.com/rndmh3ro))
- Make ssh client password login configurable. [\#29](https://github.com/dev-sec/ansible-ssh-hardening/pull/29) ([ypid](https://github.com/ypid))
- Fix join-filter, jinja-cases, indentation [\#27](https://github.com/dev-sec/ansible-ssh-hardening/pull/27) ([rndmh3ro](https://github.com/rndmh3ro))
- Fix join-filter, jinja-cases, intendation [\#27](https://github.com/dev-sec/ansible-ssh-hardening/pull/27) ([rndmh3ro](https://github.com/rndmh3ro))
- Short role review. Fixed role when ssh_client_weak_kex == true. [\#26](https://github.com/dev-sec/ansible-ssh-hardening/pull/26) ([ypid](https://github.com/ypid))
- Make it configurable to only harden ssh client/server or both \(default\). [\#25](https://github.com/dev-sec/ansible-ssh-hardening/pull/25) ([ypid](https://github.com/ypid))
- Separate system-vars from editable vars [\#24](https://github.com/dev-sec/ansible-ssh-hardening/pull/24) ([rndmh3ro](https://github.com/rndmh3ro))
+67 -79
View File
@@ -1,7 +1,7 @@
# dev-sec.ssh_hardening
[![devsec.ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening.yml)
[![devsec.ssh_hardening VM](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_vm.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_vm.yml)
[![devsec.ssh_hardening BSD](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_bsd.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_bsd.yml)
[![devsec.ssh_hardening with custom tests](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_custom_tests.yml/badge.svg)](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_custom_tests.yml)
## Description
@@ -37,40 +37,34 @@ This role uses the default port 22 or the port configured in the inventory to co
If idempotency is important, please consider using role [`ssh-hardening-fallback`](https://github.com/nununo/ansible-ssh-hardening-fallback), which is a wrapper around this role that falls back to port 22 if the configured port is unreachable.
## Disabling systemd-socket activation on Debian and Ubuntu systems
Since Debian 12 and Ubuntu 22.04 the ssh-daemon is not running by default anymore but is instead activated via systemd.
We revert this change to its traditional behaviour.
For more information, see [this issue](https://github.com/dev-sec/ansible-collection-hardening/issues/763).
<!-- BEGIN_ANSIBLE_DOCS -->
## Supported Operating Systems
- EL
- 8, 9, 10
- 7, 8, 9
- Ubuntu
- jammy, noble, resolute
- bionic, focal, jammy
- Debian
- trixie, bookworm, bullseye
- Alpine
- buster, bullseye
- Amazon
- Fedora
- ArchLinux
- SmartOS
- FreeBSD
- 14.0
- 12.2, 13.2, 14.0
- OpenBSD
- 7.0
## Role Variables
- `network_ipv6_enable`
- Default: `True`
- Default: `true`
- Description: `false` if IPv6 is not needed. `ssh_listen_to` must also be set to listen to IPv6 addresses (for example `[::]`).
- Type: bool
- Required: no
- `sftp_chroot`
- Default: `True`
- Default: `true`
- Description: Set to `false` to disable chroot for sftp.
- Type: bool
- Required: no
@@ -80,7 +74,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `sftp_enabled`
- Default: `True`
- Default: `true`
- Description: Set to `false` to disable sftp configuration.
- Type: bool
- Required: no
@@ -90,7 +84,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_allow_agent_forwarding`
- Default: `False`
- Default: `false`
- Description: Set to `false` to disable Agent Forwarding. Set to `true` to allow Agent Forwarding.
- Type: bool
- Required: no
@@ -115,9 +109,9 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_authorized_principals`
- Default: `[]`
- Default: ``
- Description: list of hashes containing file paths and authorized principals, see `default_cstom.yml` for all options. Only used if `ssh_authorized_principals_file` is set
- Type: list of ''
- Type: list
- Required: no
- `ssh_authorized_principals_file`
- Default: ``
@@ -125,7 +119,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_banner`
- Default: `False`
- Default: `false`
- Description: Set to `true` to print a banner on login.
- Type: bool
- Required: no
@@ -135,14 +129,14 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_challengeresponseauthentication`
- Default: `False`
- Default: `false`
- Description: Specifies whether challenge-response authentication is allowed (e.g. via PAM).
- Type: bool
- Required: no
- `ssh_ciphers`
- Default: ``
- Description: Change this list to overwrite ciphers. Defaults found in `defaults/main.yml`
- Type: list of ''
- Type: list
- Required: no
- `ssh_client_alive_count`
- Default: `3`
@@ -155,7 +149,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: int
- Required: no
- `ssh_client_compression`
- Default: `False`
- Default: `false`
- Description: Specifies whether the client requests compression.
- Type: bool
- Required: no
@@ -165,17 +159,17 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_client_hardening`
- Default: `True`
- Default: `true`
- Description: Set to `false` to stop harden the client.
- Type: bool
- Required: no
- `ssh_client_host_key_algorithms`
- Default: `[]`
- Default: ``
- Description: Specifies the host key algorithms that the client wants to use in order of preference. If empty the default list will be used. Otherwise overrides the setting with specified list of algorithms. Check `man ssh_config`, `ssh -Q HostKeyAlgorithms` or other sources for supported algorithms - make sure you check the correct version!
- Type: list of ''
- Type: list
- Required: no
- `ssh_client_password_login`
- Default: `False`
- Default: `false`
- Description: Set to `true` to allow password-based authentication with the ssh client.
- Type: bool
- Required: no
@@ -185,19 +179,19 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_client_roaming`
- Default: `False`
- Default: `false`
- Description: enable experimental client roaming.
- Type: bool
- Required: no
- `ssh_compression`
- Default: `False`
- Default: `false`
- Description: Specifies whether server-side compression is enabled after the user has authenticated successfully.
- Type: bool
- Required: no
- `ssh_custom_options`
- Default: `[]`
- Default: ``
- Description: Custom lines for SSH client configuration.
- Type: list of ''
- Type: list
- Required: no
- `ssh_custom_selinux_dir`
- Default: `/etc/selinux/local-policies`
@@ -214,45 +208,40 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Description: if specified, login is disallowed for user names that match one of the patterns.
- Type: str
- Required: no
- `ssh_forward_agent`
- Default: `no`
- Description: Enables the ssh forward agent for the Cli if set to 'yes'
- Type: str
- Required: no
- `ssh_gateway_ports`
- Default: `False`
- Default: `false`
- Description: Set to `false` to disable binding forwarded ports to non-loopback addresses. Set to `true` to force binding on wildcard address. Set to `clientspecified` to allow the client to specify which address to bind to.
- Type: raw
- Type: bool
- Required: no
- `ssh_gssapi_delegation`
- Default: `False`
- Default: `false`
- Description: Set to `true` to enable GSSAPI credential forwarding.
- Type: bool
- Required: no
- `ssh_gssapi_support`
- Default: `False`
- Default: `false`
- Description: Set to `true` to enable GSSAPI authentication (both client and server).
- Type: bool
- Required: no
- `ssh_hardening_enabled`
- Default: `True`
- Default: `true`
- Description: Whether to run the hardening
- Type: bool
- Required: no
- `ssh_host_certificates`
- Default: `[]`
- Default: ``
- Description: Host certificates to look for when starting sshd
- Type: list of ''
- Type: list
- Required: no
- `ssh_host_key_algorithms`
- Default: `[]`
- Default: ``
- Description: Host key algorithms that the server offers. If empty the default list will be used. Otherwise overrides the setting with specified list of algorithms. Check `man sshd_config`, `ssh -Q HostKeyAlgorithms` or other sources for supported algorithms - make sure you check the correct version
- Type: list of ''
- Type: list
- Required: no
- `ssh_host_key_files`
- Default: ``
- Description: Host keys for sshd. If empty ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'] will be used, as far as supported by the installed sshd version.
- Type: list of ''
- Type: list
- Required: no
- `ssh_host_rsa_key_size`
- Default: `4096`
@@ -260,19 +249,19 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: int
- Required: no
- `ssh_kerberos_support`
- Default: `True`
- Default: `true`
- Description: Set to `true` if SSH has Kerberos support.
- Type: bool
- Required: no
- `ssh_kex`
- Default: ``
- Description: Change this list to overwrite kexs. Defaults found in `defaults/main.yml`
- Type: list of ''
- Type: list
- Required: no
- `ssh_listen_to`
- Default: `['0.0.0.0']`
- Default: `["0.0.0.0"]`
- Description: one or more ip addresses, to which ssh-server should listen to. Default is all IPv4 addresses, but should be configured to specific addresses for security reasons
- Type: list of ''
- Type: list
- Required: no
- `ssh_login_grace_time`
- Default: `30s`
@@ -282,7 +271,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- `ssh_macs`
- Default: ``
- Description: Change this list to overwrite macs. Defaults found in `defaults/main.yml`
- Type: list of ''
- Type: list
- Required: no
- `ssh_max_auth_retries`
- Default: `2`
@@ -300,7 +289,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_pam_support`
- Default: `True`
- Default: `true`
- Description: Set to `true` if SSH has PAM support.
- Type: bool
- Required: no
@@ -311,7 +300,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Required: no
- `ssh_permit_tunnel`
- Default: `no`
- Description: Specifies whether tun(4) device forwarding is allowed. The argument must be "yes", point-to-point (layer 3), ethernet (layer 2), or "no". Specifying yes permits both point-to-point and ethernet. - The quotes are required!
- Description: Specifies whether tun(4) device forwarding is allowed. The argument must be yes, point-to-point (layer 3), ethernet (layer 2), or no. Specifying yes permits both point-to-point and ethernet.
- Type: str
- Required: no
- Choices:
@@ -320,22 +309,22 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- point-to-point
- ethernet
- `ssh_print_debian_banner`
- Default: `False`
- Default: `false`
- Description: Set to `true` to print debian specific banner.
- Type: bool
- Required: no
- `ssh_print_last_log`
- Default: `False`
- Default: `false`
- Description: Set to `false` to disable display of last login information.
- Type: bool
- Required: no
- `ssh_print_motd`
- Default: `False`
- Default: `false`
- Description: Set to `false` to disable printing of the MOTD.
- Type: bool
- Required: no
- `ssh_print_pam_motd`
- Default: `False`
- Default: `false`
- Description: Set to `false` to disable printing of the MOTD via pam (Debian and Ubuntu).
- Type: bool
- Required: no
@@ -345,9 +334,9 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_remote_hosts`
- Default: `[]`
- Default: ``
- Description: one or more hosts and their custom options for the ssh-client. Default is empty. See examples in `defaults/main.yml`
- Type: list of ''
- Type: list
- Required: no
- `ssh_server_accept_env_vars`
- Default: ``
@@ -360,12 +349,12 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_server_enabled`
- Default: `True`
- Default: `true`
- Description: Set to `false` to disable the opensshd server.
- Type: bool
- Required: no
- `ssh_server_hardening`
- Default: `True`
- Default: `true`
- Description: Set to `false` to stop harden the server.
- Type: bool
- Required: no
@@ -390,7 +379,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_server_password_login`
- Default: `False`
- Default: `false`
- Description: Set to `true` to allow password-based authentication to the ssh server. You probably also need to change `sshd_authenticationmethods` to include `password` if you set `ssh_server_password_login`: `true`.
- Type: bool
- Required: no
@@ -400,24 +389,19 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_server_ports`
- Default: `['22']`
- Default: `["22"]`
- Description: ports on which ssh-server should listen.
- Type: list of ''
- Type: list
- Required: no
- `ssh_server_revoked_keys`
- Default: `[]`
- Default: ``
- Description: a list of revoked public keys that the ssh server will always reject, useful to revoke known weak or compromised keys.
- Type: list of ''
- Required: no
- `ssh_server_service_enabled`
- Default: `True`
- Description: Set to `false` to disable starting sshd at boot.
- Type: bool
- Type: list
- Required: no
- `ssh_trusted_user_ca_keys`
- Default: `[]`
- Default: ``
- Description: set the trusted certificate authorities public keys used to sign user certificates. Only used if `ssh_trusted_user_ca_keys_file` is set.
- Type: list of ''
- Type: list
- Required: no
- `ssh_trusted_user_ca_keys_file`
- Default: ``
@@ -425,29 +409,34 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: str
- Required: no
- `ssh_use_dns`
- Default: `False`
- Default: `false`
- Description: Specifies whether sshd should look up the remote host name, and to check that the resolved host name for the remote IP address maps back to the very same IP address.
- Type: bool
- Required: no
- `ssh_use_pam`
- Default: `True`
- Default: `true`
- Description: Set to `false` to disable pam authentication.
- Type: bool
- Required: no
- `ssh_x11_forwarding`
- Default: `False`
- Default: `false`
- Description: Set to `false` to disable X11 Forwarding. Set to `true` to allow X11 Forwarding.
- Type: bool
- Required: no
- `ssh_pubkey_authentication`
- Default: `true`
- Description: Set to `false` to disable publickey authentication.
- Type: bool
- Required: no
- `sshd_authenticationmethods`
- Default: `publickey`
- Description: Specifies the authentication methods that must be successfully completed for a user to be granted access. Make sure to set all required variables for your selected authentication method. Defaults found in `defaults/main.yml`
- Type: str
- Required: no
- `sshd_custom_options`
- Default: `[]`
- Default: ``
- Description: Custom lines for SSH daemon configuration.
- Type: list of ''
- Type: list
- Required: no
- `sshd_log_level`
- Default: `VERBOSE`
@@ -465,7 +454,7 @@ For more information, see [this issue](https://github.com/dev-sec/ansible-collec
- Type: int
- Required: no
- `sshd_strict_modes`
- Default: `True`
- Default: `true`
- Description: Check file modes and ownership of the user's files and home directory before accepting login.
- Type: bool
- Required: no
@@ -483,7 +472,6 @@ None.
```
- hosts: all
become: true
roles:
- name: devsec.hardening.ssh_hardening
```
+7 -5
View File
@@ -1,5 +1,4 @@
---
# true if IPv6 is needed
network_ipv6_enable: true # sshd + ssh
@@ -7,12 +6,9 @@ network_ipv6_enable: true # sshd + ssh
ssh_client_config_file: /etc/ssh/ssh_config # ssh
ssh_server_config_file: /etc/ssh/sshd_config # sshd
# true if sshd should be started
# true if sshd should be started and enabled
ssh_server_enabled: true # sshd
# true if sshd should be enabled at boot
ssh_server_service_enabled: true # sshd
# true if DNS resolutions are needed, look up the remote host name,
# defaults to false from 6.8, see: http://www.openssh.com/txt/release-6.8
ssh_use_dns: false # sshd
@@ -40,6 +36,9 @@ ssh_client_port: "22" # ssh
# Default is empty, but should be configured for security reasons!
ssh_listen_to: [0.0.0.0] # sshd
# Host keys to look for when starting sshd.
ssh_host_key_files: [] # sshd
# Host RSA key size in bits
ssh_host_rsa_key_size: 4096 # sshd
@@ -203,6 +202,9 @@ ssh_max_startups: 10:30:60 # sshd
ssh_ps59: sandbox
ssh_macs: []
ssh_ciphers: []
ssh_kex: []
# directory where to store ssh_password policy
ssh_custom_selinux_dir: /etc/selinux/local-policies
Loaded 100 of 121 files, more files were not shown because too many files have changed in this diff. Show more