Compare commits
188
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d14b24303d | ||
|
|
13c40f66ad | ||
|
|
5739b6861b | ||
|
|
b9475287a4 | ||
|
|
4cb67edbe5 | ||
|
|
4f66ec4c26 | ||
|
|
16e86125e9 | ||
|
|
db2bfc91da | ||
|
|
eb57ed4eaa | ||
|
|
69cd800387 | ||
|
|
00443de508 | ||
|
|
b35b82108b | ||
|
|
95aab25520 | ||
|
|
bdf6d65cfd | ||
|
|
0740ebf041 | ||
|
|
a301b1c905 | ||
|
|
02ad7664ea | ||
|
|
b0dff13204 | ||
|
|
bb9358e2fb | ||
|
|
3ba52e59e2 | ||
|
|
e54c541d3b | ||
|
|
a0abefbc29 | ||
|
|
898bf73178 | ||
|
|
4a25f72076 | ||
|
|
7a76975d01 | ||
|
|
063f3190b8 | ||
|
|
4c4721c32f | ||
|
|
66a48b4616 | ||
|
|
9865223b8f | ||
|
|
11cf72b7e2 | ||
|
|
5bf19934da | ||
|
|
12c0f9678a | ||
|
|
05a086be24 | ||
|
|
cbbaee7411 | ||
|
|
72eb74a85f | ||
|
|
94a49a4916 | ||
|
|
e5cc9bbf43 | ||
|
|
aca4bc7cb7 | ||
|
|
81e177b80c | ||
|
|
3794251a94 | ||
|
|
4974bb3422 | ||
|
|
b12e212d9d | ||
|
|
e7bad430f2 | ||
|
|
bf13c44a2d | ||
|
|
d93c7401cf | ||
|
|
d8c9ac71ec | ||
|
|
ce741c9f47 | ||
|
|
6b11603c5b | ||
|
|
05cc027919 | ||
|
|
7b209b831d | ||
|
|
b9a0e65e19 | ||
|
|
e37f01df26 | ||
|
|
1f0d2d5b73 | ||
|
|
5843b03449 | ||
|
|
bf51b96a0b | ||
|
|
4bc5725836 | ||
|
|
62340c79c6 | ||
|
|
bc8b5f60f4 | ||
|
|
dff224f4c4 | ||
|
|
422fb940a9 | ||
|
|
7e33ea0bae | ||
|
|
459113a1e6 | ||
|
|
5381a23a4a | ||
|
|
e00716df62 | ||
|
|
6ce8b68650 | ||
|
|
f4500457fa | ||
|
|
2bbfe2dd6b | ||
|
|
db437c79f5 | ||
|
|
099145c9b3 | ||
|
|
9862676ecf | ||
|
|
6ef52a125d | ||
|
|
bde286fe47 | ||
|
|
a58fc24301 | ||
|
|
12240fea63 | ||
|
|
82a0188b8c | ||
|
|
5a062c6db2 | ||
|
|
508b993570 | ||
|
|
54f9ef42a1 | ||
|
|
25acb76c05 | ||
|
|
0f6b8e4a3a | ||
|
|
571cec1a5c | ||
|
|
20dd04c9cb | ||
|
|
60d10811d4 | ||
|
|
84c43c0550 | ||
|
|
c76862831b | ||
|
|
f9a1cab023 | ||
|
|
f15ff3fc83 | ||
|
|
aae720c977 | ||
|
|
af8045a55a | ||
|
|
c3b9245900 | ||
|
|
5c5f2ce446 | ||
|
|
7b32deca17 | ||
|
|
e2c2d0d5e2 | ||
|
|
addbbd32cf | ||
|
|
01cc9c811f | ||
|
|
e98d766c6c | ||
|
|
a15159d072 | ||
|
|
dc432ba71c | ||
|
|
2c91f89903 | ||
|
|
83cf8aedcc | ||
|
|
9c848839d9 | ||
|
|
1b69855d51 | ||
|
|
512e31f1ae | ||
|
|
2db75b53c1 | ||
|
|
aea12c8b90 | ||
|
|
0371a2690b | ||
|
|
3525db8c44 | ||
|
|
adda83572a | ||
|
|
01bde49fbc | ||
|
|
9bf243f198 | ||
|
|
3d98cbf67b | ||
|
|
4a5a6e18e7 | ||
|
|
5ac5547ba4 | ||
|
|
15f2de8b44 | ||
|
|
695f85f758 | ||
|
|
57d2d524b3 | ||
|
|
e4cfa198af | ||
|
|
eac33e8918 | ||
|
|
655cb49630 | ||
|
|
3c73f8ab1d | ||
|
|
8e97184d5e | ||
|
|
7437f68c86 | ||
|
|
bf177add07 | ||
|
|
fb22b242fe | ||
|
|
0c8c96a535 | ||
|
|
99784726f8 | ||
|
|
2f5360225b | ||
|
|
fdf7bbd7be | ||
|
|
ee1fec3d3e | ||
|
|
35df355248 | ||
|
|
ec8811acdf | ||
|
|
6681e0b319 | ||
|
|
79dc1d5474 | ||
|
|
219ec1938b | ||
|
|
336861838a | ||
|
|
b07ac77223 | ||
|
|
665edd5157 | ||
|
|
8f516018b6 | ||
|
|
4756a620f2 | ||
|
|
c59a4d4e48 | ||
|
|
216b56f468 | ||
|
|
36715017d7 | ||
|
|
2c18d3afda | ||
|
|
bd721317d2 | ||
|
|
92e6cad463 | ||
|
|
66adae0faa | ||
|
|
dc583422bc | ||
|
|
4c5a5deec6 | ||
|
|
a6892904bf | ||
|
|
0675167cb2 | ||
|
|
8d5143b5d7 | ||
|
|
0bf528d83b | ||
|
|
cd572de55a | ||
|
|
da017fa880 | ||
|
|
4978598e00 | ||
|
|
ac7ef8aae6 | ||
|
|
27a1f6e5e8 | ||
|
|
e84b407c44 | ||
|
|
8252b82764 | ||
|
|
5aa26aa039 | ||
|
|
1b0576695e | ||
|
|
d63015c2a7 | ||
|
|
a08a057f7b | ||
|
|
787ac9bd54 | ||
|
|
91d10892dc | ||
|
|
90ca33466e | ||
|
|
b01789b14b | ||
|
|
526e369999 | ||
|
|
9c2f12561a | ||
|
|
cec9c99763 | ||
|
|
dae8487ab3 | ||
|
|
35d87aa678 | ||
|
|
6833d66634 | ||
|
|
3bdd8c851e | ||
|
|
d86859962d | ||
|
|
965c9326d0 | ||
|
|
9c5b619149 | ||
|
|
ff4f2ee7f4 | ||
|
|
f602bc621a | ||
|
|
e3273a8d54 | ||
|
|
ca5484f96e | ||
|
|
c1a0bcbe9d | ||
|
|
f295397611 | ||
|
|
96ba9d1d8d | ||
|
|
3fb0831d7b | ||
|
|
ef5e8801e4 | ||
|
|
9950f9ba52 | ||
|
|
6bcdb253ec |
No files matched your search
@@ -0,0 +1,50 @@
|
||||
output_template: |
|
||||
<!-- BEGIN_ANSIBLE_DOCS -->
|
||||
|
||||
## Supported Operating Systems
|
||||
|
||||
{%- for platform in metadata.galaxy_info.platforms %}
|
||||
- {{ platform.name }}
|
||||
{%- if "versions" in platform %}
|
||||
- {{ platform.versions | default([]) | join(', ') }}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
|
||||
## Role Variables
|
||||
{% for entrypoint in argument_specs.keys() %}
|
||||
{%- set path, options=entrypoint_options[entrypoint][0] -%}
|
||||
{%- for name, details in options.items() |sort() %}
|
||||
- `{{ name }}`
|
||||
- Default: `{{ details.display_default }}`
|
||||
- Description: {{ details.display_description }}
|
||||
- Type: {{ details.display_type }}
|
||||
- Required: {{ details.display_required }}
|
||||
{%- if details.choices %}
|
||||
- Choices:
|
||||
{%- for choice in details.choices %}
|
||||
- {{ choice }}
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{%- endfor %}
|
||||
|
||||
## Dependencies
|
||||
|
||||
{%- if ("dependencies" in metadata) and (metadata.dependencies | length > 0) %}
|
||||
{%- for dependency in metadata.dependencies %}
|
||||
- {{ dependency }}
|
||||
{%- endfor %}
|
||||
{%- else %}
|
||||
|
||||
None.
|
||||
{%- endif %}
|
||||
|
||||
## Example Playbook
|
||||
|
||||
```
|
||||
- hosts: all
|
||||
roles:
|
||||
- name: {{ role }}
|
||||
```
|
||||
|
||||
<!-- END_ANSIBLE_DOCS -->
|
||||
@@ -5,9 +5,12 @@
|
||||
# option will be parsed relative to the CWD of execution.
|
||||
exclude_paths:
|
||||
- .cache/ # implicit unless exclude_paths is defined in config
|
||||
- .yamllint
|
||||
- ../molecule/
|
||||
- ../.github/
|
||||
# add all waivers individually, since exclude_files does not support globs
|
||||
- molecule/os_hardening/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
|
||||
@@ -15,3 +18,4 @@ mock_roles:
|
||||
|
||||
skip_list:
|
||||
- var-naming[no-role-prefix]
|
||||
- meta-runtime[unsupported-version]
|
||||
@@ -31,7 +31,7 @@ body:
|
||||
attributes:
|
||||
label: "Reproduction steps"
|
||||
render: Shell
|
||||
description: Paste an example playbook that can be used to reproduce the problem. This will be automatically formatted into code, so no need for backticks.
|
||||
description: Paste an example playbook that can be used to reproduce the problem. This will be automatically formatted into code, no need for backticks.
|
||||
value: |
|
||||
...
|
||||
validations:
|
||||
|
||||
+22
-14
@@ -1,22 +1,30 @@
|
||||
---
|
||||
mysql_hardening:
|
||||
- 'roles/mysql_hardening/**'
|
||||
- 'molecule/mysql_hardening/**'
|
||||
- '.github/workflows/mysql_hardening.yml'
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- roles/mysql_hardening/**
|
||||
- molecule/mysql_hardening/**
|
||||
- .github/workflows/mysql_hardening.yml
|
||||
|
||||
os_hardening:
|
||||
- 'roles/os_hardening/**'
|
||||
- 'molecule/os_hardening/**'
|
||||
- '.github/workflows/os_hardening.yml'
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- roles/os_hardening/**
|
||||
- molecule/os_hardening/**
|
||||
- .github/workflows/os_hardening.yml
|
||||
|
||||
ssh_hardening:
|
||||
- 'roles/ssh_hardening/**'
|
||||
- 'molecule/ssh_hardening/**'
|
||||
- 'molecule/ssh_hardening_custom_tests/**'
|
||||
- '.github/workflows/ssh_hardening.yml'
|
||||
- '.github/workflows/ssh_hardening_custom_tests.yml'
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- roles/ssh_hardening/**
|
||||
- molecule/ssh_hardening/**
|
||||
- molecule/ssh_hardening_custom_tests/**
|
||||
- .github/workflows/ssh_hardening.yml
|
||||
- .github/workflows/ssh_hardening_custom_tests.yml
|
||||
|
||||
nginx_hardening:
|
||||
- 'roles/nginx_hardening/**'
|
||||
- 'molecule/nginx_hardening/**'
|
||||
- '.github/workflows/nginx_hardening.yml'
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- roles/nginx_hardening/**
|
||||
- molecule/nginx_hardening/**
|
||||
- .github/workflows/nginx_hardening.yml
|
||||
@@ -7,22 +7,26 @@ on: # yamllint disable-line rule:truthy
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/**'
|
||||
- 'molecule/**'
|
||||
- 'requirements.txt'
|
||||
- '.github/workflows/ansible-lint.yml'
|
||||
- '.config/ansible-lint.yml'
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/**'
|
||||
- 'molecule/**'
|
||||
- 'requirements.txt'
|
||||
- '.github/workflows/ansible-lint.yml'
|
||||
- '.config/ansible-lint.yml'
|
||||
|
||||
jobs:
|
||||
ansible-lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Important: This sets up your GITHUB_WORKSPACE environment variable
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Lint Ansible Playbook
|
||||
# replace "master" with any valid ref
|
||||
uses: ansible/ansible-lint-action@main
|
||||
with:
|
||||
path: "roles/"
|
||||
uses: ansible/ansible-lint@v24
|
||||
@@ -4,11 +4,16 @@ name: "Enforce PR labels"
|
||||
on: # yamllint disable-line rule:truthy
|
||||
pull_request_target:
|
||||
types: [labeled, unlabeled, opened, edited, synchronize]
|
||||
|
||||
permissions:
|
||||
contents: read # to read configuration file
|
||||
pull-requests: write # to label PRs
|
||||
|
||||
jobs:
|
||||
enforce-label:
|
||||
if: github.repository == 'dev-sec/ansible-collection-hardening'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@main
|
||||
- uses: actions/labeler@v5.0.0
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
@@ -4,14 +4,14 @@ name: Publish collection to Ansible Galaxy
|
||||
on: # yamllint disable-line rule:truthy
|
||||
release:
|
||||
types:
|
||||
- published
|
||||
- released
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
if: github.repository == 'dev-sec/ansible-collection-hardening'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# deploy the collection first, because if it fails, we don't want
|
||||
# to update the galaxy.yml
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
galaxy_version: ${{ github.event.release.tag_name }}
|
||||
|
||||
# checkout master instead of the release-tag so we can push the galaxy.yml
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: master
|
||||
|
||||
@@ -9,12 +9,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- 'roles/mysql_hardening/**'
|
||||
- 'molecule/mysql_hardening/**'
|
||||
- '.github/workflows/mysql_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/mysql_hardening/**'
|
||||
- 'molecule/mysql_hardening/**'
|
||||
- '.github/workflows/mysql_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
schedule:
|
||||
- cron: '0 6 * * 0'
|
||||
|
||||
@@ -45,21 +47,22 @@ jobs:
|
||||
- ubuntu2204
|
||||
- debian10
|
||||
- debian11
|
||||
- debian12
|
||||
# - 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@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ansible_collections/devsec/hardening
|
||||
submodules: true
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
@@ -78,6 +81,17 @@ jobs:
|
||||
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
|
||||
if: ${{ startsWith(matrix.molecule_distro, 'Debian') }}
|
||||
|
||||
# Molecule has problems detecting the proper location for installing roles
|
||||
# https://github.com/ansible/molecule/issues/3806
|
||||
# we do not set a custom role path, but the automatically determined install path used is not compatible with the location molecule expects the role
|
||||
# see CI logs of this action "INFO Set ANSIBLE_ROLES_PATH" should not be present, since we do not set a custom path
|
||||
# we have to find a proper way to configure this
|
||||
- name: Temporary fix for roles
|
||||
run: |
|
||||
mkdir -p /home/runner/.ansible
|
||||
ln -s /home/runner/work/ansible-collection-hardening/ansible-collection-hardening/ansible_collections/devsec/hardening/roles \
|
||||
/home/runner/.ansible/roles
|
||||
|
||||
- name: Test with molecule
|
||||
run: |
|
||||
molecule --version
|
||||
|
||||
@@ -8,12 +8,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- 'roles/nginx_hardening/**'
|
||||
- 'molecule/nginx_hardening/**'
|
||||
- '.github/workflows/nginx_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/nginx_hardening/**'
|
||||
- 'molecule/nginx_hardening/**'
|
||||
- '.github/workflows/nginx_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
schedule:
|
||||
- cron: '0 6 * * 1'
|
||||
|
||||
@@ -44,21 +46,22 @@ jobs:
|
||||
- ubuntu2204
|
||||
- debian10
|
||||
- debian11
|
||||
- debian12
|
||||
- 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@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ansible_collections/devsec/hardening
|
||||
submodules: true
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
@@ -67,6 +70,17 @@ jobs:
|
||||
pip install -r requirements.txt
|
||||
working-directory: ansible_collections/devsec/hardening
|
||||
|
||||
# Molecule has problems detecting the proper location for installing roles
|
||||
# https://github.com/ansible/molecule/issues/3806
|
||||
# we do not set a custom role path, but the automatically determined install path used is not compatible with the location molecule expects the role
|
||||
# see CI logs of this action "INFO Set ANSIBLE_ROLES_PATH" should not be present, since we do not set a custom path
|
||||
# we have to find a proper way to configure this
|
||||
- name: Temporary fix for roles
|
||||
run: |
|
||||
mkdir -p /home/runner/.ansible
|
||||
ln -s /home/runner/work/ansible-collection-hardening/ansible-collection-hardening/ansible_collections/devsec/hardening/roles \
|
||||
/home/runner/.ansible/roles
|
||||
|
||||
- name: Test with molecule
|
||||
run: |
|
||||
molecule --version
|
||||
|
||||
@@ -8,12 +8,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- 'roles/os_hardening/**'
|
||||
- 'molecule/os_hardening/**'
|
||||
- '.github/workflows/os_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/os_hardening/**'
|
||||
- 'molecule/os_hardening/**'
|
||||
- '.github/workflows/os_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
schedule:
|
||||
- cron: '0 6 * * 3'
|
||||
|
||||
@@ -39,27 +41,28 @@ jobs:
|
||||
- centosstream9
|
||||
- rocky8
|
||||
- rocky9
|
||||
- fedora37
|
||||
- fedora38
|
||||
- fedora39
|
||||
- ubuntu1804
|
||||
- ubuntu2004
|
||||
- ubuntu2204
|
||||
- debian10
|
||||
- debian11
|
||||
- debian12
|
||||
- amazon2023
|
||||
- opensuse_tumbleweed
|
||||
- arch
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ansible_collections/devsec/hardening
|
||||
submodules: true
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
|
||||
@@ -8,12 +8,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- 'roles/os_hardening/**'
|
||||
- 'molecule/os_hardening_vm/**'
|
||||
- '.github/workflows/os_hardening_vm.yml'
|
||||
- 'requirements.txt'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/os_hardening/**'
|
||||
- 'molecule/os_hardening_vm/**'
|
||||
- '.github/workflows/os_hardening_vm.yml'
|
||||
- 'requirements.txt'
|
||||
schedule:
|
||||
- cron: '0 6 * * 2'
|
||||
|
||||
@@ -34,27 +36,32 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
molecule_distro:
|
||||
- centos7
|
||||
- centos8s
|
||||
- centos9s
|
||||
- rocky8
|
||||
- rocky9
|
||||
- fedora37
|
||||
- fedora38
|
||||
- ubuntu1804
|
||||
- ubuntu2004
|
||||
- ubuntu2204
|
||||
- debian10
|
||||
- debian11
|
||||
- opensuse15
|
||||
# - arch # needs fix for audit
|
||||
- generic/centos7
|
||||
- generic/centos8s
|
||||
- generic/centos9s
|
||||
- generic/rocky8
|
||||
- generic/rocky9
|
||||
- fedora/38-cloud-base
|
||||
- fedora/39-cloud-base
|
||||
- generic/ubuntu1804
|
||||
- generic/ubuntu2004
|
||||
- generic/ubuntu2204
|
||||
- generic/debian10
|
||||
- generic/debian11
|
||||
- generic/debian12
|
||||
- generic/opensuse15
|
||||
- generic/arch
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ansible_collections/devsec/hardening
|
||||
submodules: true
|
||||
|
||||
- name: Update Vagrant Box
|
||||
run: |
|
||||
vagrant box update --box ${{ matrix.molecule_distro }} || true
|
||||
|
||||
- name: Test with molecule
|
||||
run: |
|
||||
molecule --version
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Git checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
if: github.repository == 'dev-sec/ansible-collection-hardening'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: master
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
name: create roles readme
|
||||
|
||||
on: # yamllint disable-line rule:truthy
|
||||
push:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/**/meta/argument_specs.yml'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/**/meta/argument_specs.yml'
|
||||
|
||||
jobs:
|
||||
readme:
|
||||
name: create roles readme
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
roles:
|
||||
- mysql_hardening
|
||||
- nginx_hardening
|
||||
- os_hardening
|
||||
- ssh_hardening
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.12
|
||||
|
||||
- name: Install aar_doc
|
||||
run: pip3 install aar_doc
|
||||
|
||||
- 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/[email protected]
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: 'update ${{ matrix.roles }} readme'
|
||||
files: roles/${{ matrix.roles }}/README.md
|
||||
rebase: true
|
||||
name: dev-sec CI
|
||||
email: [email protected]
|
||||
@@ -8,12 +8,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- 'roles/ssh_hardening/**'
|
||||
- 'molecule/ssh_hardening/**'
|
||||
- '.github/workflows/ssh_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/ssh_hardening/**'
|
||||
- 'molecule/ssh_hardening/**'
|
||||
- '.github/workflows/ssh_hardening.yml'
|
||||
- 'requirements.txt'
|
||||
schedule:
|
||||
- cron: '0 6 * * 5'
|
||||
|
||||
@@ -39,27 +41,28 @@ jobs:
|
||||
- centosstream9
|
||||
- rocky8
|
||||
- rocky9
|
||||
- fedora37
|
||||
- fedora38
|
||||
- fedora39
|
||||
- ubuntu1804
|
||||
- ubuntu2004
|
||||
- ubuntu2204
|
||||
- debian10
|
||||
- debian11
|
||||
- debian12
|
||||
- amazon2023
|
||||
- arch
|
||||
# - 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@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ansible_collections/devsec/hardening
|
||||
submodules: true
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
|
||||
@@ -8,12 +8,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- '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'
|
||||
|
||||
@@ -36,13 +38,19 @@ jobs:
|
||||
molecule_distro:
|
||||
- openbsd7
|
||||
- freebsd12
|
||||
- freebsd13
|
||||
- freebsd14
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
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
|
||||
|
||||
@@ -8,12 +8,14 @@ on: # yamllint disable-line rule:truthy
|
||||
- 'roles/ssh_hardening/**'
|
||||
- 'molecule/ssh_hardening_custom_tests/**'
|
||||
- '.github/workflows/ssh_hardening_custom_tests.yml'
|
||||
- 'requirements.txt'
|
||||
pull_request:
|
||||
branches: [master]
|
||||
paths:
|
||||
- 'roles/ssh_hardening/**'
|
||||
- 'molecule/ssh_hardening_custom_tests/**'
|
||||
- '.github/workflows/ssh_hardening_custom_tests.yml'
|
||||
- 'requirements.txt'
|
||||
schedule:
|
||||
- cron: '0 6 * * 4'
|
||||
|
||||
@@ -39,27 +41,28 @@ jobs:
|
||||
- centosstream9
|
||||
- rocky8
|
||||
- rocky9
|
||||
- fedora37
|
||||
- fedora38
|
||||
- fedora39
|
||||
- ubuntu1804
|
||||
- ubuntu2004
|
||||
- ubuntu2204
|
||||
- debian10
|
||||
- debian11
|
||||
- debian12
|
||||
- amazon2023
|
||||
- arch
|
||||
# - 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@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ansible_collections/devsec/hardening
|
||||
submodules: true
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
|
||||
+116
-3
@@ -1,22 +1,136 @@
|
||||
# Changelog
|
||||
|
||||
## [8.8.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.8.0) (2023-06-20)
|
||||
## [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/9.0.1...9.0.2)
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- 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)
|
||||
- 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:**
|
||||
|
||||
- os\_hardening fails when setting vm.mmap\_rnd\_bits [\#757](https://github.com/dev-sec/ansible-collection-hardening/issues/757)
|
||||
- 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)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- 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))
|
||||
- Update ansible/ansible-lint action to v24 [\#745](https://github.com/dev-sec/ansible-collection-hardening/pull/745) ([renovate[bot]](https://github.com/apps/renovate))
|
||||
- Always update Vagrant Boxes before using [\#744](https://github.com/dev-sec/ansible-collection-hardening/pull/744) ([schurzi](https://github.com/schurzi))
|
||||
- Remove Docker containers on self-hosted runner after tests [\#743](https://github.com/dev-sec/ansible-collection-hardening/pull/743) ([schurzi](https://github.com/schurzi))
|
||||
- Update dependency ansible-core to v2.16.3 [\#742](https://github.com/dev-sec/ansible-collection-hardening/pull/742) ([renovate[bot]](https://github.com/apps/renovate))
|
||||
|
||||
## [9.0.1](https://github.com/dev-sec/ansible-collection-hardening/tree/9.0.1) (2024-01-15)
|
||||
|
||||
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/9.0.0...9.0.1)
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- Extend ansible-lint testing to cover our test cases [\#731](https://github.com/dev-sec/ansible-collection-hardening/issues/731)
|
||||
- Complete tests for OS hardening [\#660](https://github.com/dev-sec/ansible-collection-hardening/issues/660)
|
||||
- support restarts of audit service on Arch linux [\#722](https://github.com/dev-sec/ansible-collection-hardening/pull/722) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Fails to install [\#735](https://github.com/dev-sec/ansible-collection-hardening/issues/735)
|
||||
- Amazon Linux gpg check fails [\#734](https://github.com/dev-sec/ansible-collection-hardening/issues/734)
|
||||
- ssh\_hardening ipv6 [\#719](https://github.com/dev-sec/ansible-collection-hardening/issues/719)
|
||||
- boolean variable inconsistency? [\#330](https://github.com/dev-sec/ansible-collection-hardening/issues/330)
|
||||
- Restore idempotency for disabling unused filesystems with Ansible 2.16.0 [\#718](https://github.com/dev-sec/ansible-collection-hardening/pull/718) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([akikanellis](https://github.com/akikanellis))
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- 9.0.0 version number in galaxy.yml file is wrong [\#740](https://github.com/dev-sec/ansible-collection-hardening/issues/740)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- restructure readme to move known limitations up top [\#739](https://github.com/dev-sec/ansible-collection-hardening/pull/739) [[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))
|
||||
- release only on releases, not pre-releases [\#738](https://github.com/dev-sec/ansible-collection-hardening/pull/738) ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
- Update dependency ansible-core to v2.16.2 [\#737](https://github.com/dev-sec/ansible-collection-hardening/pull/737) ([renovate[bot]](https://github.com/apps/renovate))
|
||||
- fix linting for github config [\#736](https://github.com/dev-sec/ansible-collection-hardening/pull/736) ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
- Update actions/setup-python action to v5 [\#733](https://github.com/dev-sec/ansible-collection-hardening/pull/733) ([renovate[bot]](https://github.com/apps/renovate))
|
||||
- Update ansible-lint action and revise configuration to scan all Ansible code [\#732](https://github.com/dev-sec/ansible-collection-hardening/pull/732) ([schurzi](https://github.com/schurzi))
|
||||
- update labeler to new config format [\#730](https://github.com/dev-sec/ansible-collection-hardening/pull/730) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
|
||||
- Update dependency ansible-core to v2.16.1 [\#728](https://github.com/dev-sec/ansible-collection-hardening/pull/728) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
|
||||
- pin Ansible to always let Renovate update to the most current version in our tests [\#721](https://github.com/dev-sec/ansible-collection-hardening/pull/721) [[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))
|
||||
|
||||
## [9.0.0](https://github.com/dev-sec/ansible-collection-hardening/tree/9.0.0) (2023-11-16)
|
||||
|
||||
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.8.0...9.0.0)
|
||||
|
||||
**Breaking changes:**
|
||||
|
||||
- make it possible to configure more then yes and no for PermitTunnel [\#715](https://github.com/dev-sec/ansible-collection-hardening/pull/715) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
- add role argument spec for os, ssh, mysql [\#687](https://github.com/dev-sec/ansible-collection-hardening/pull/687) [[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))
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- Create role documentation with Automated-Ansible-Role-Documentation [\#694](https://github.com/dev-sec/ansible-collection-hardening/issues/694)
|
||||
- Minimize access user paths should be fully configurable [\#689](https://github.com/dev-sec/ansible-collection-hardening/issues/689)
|
||||
- Add support for Debian 12 [\#672](https://github.com/dev-sec/ansible-collection-hardening/issues/672)
|
||||
- add testing and support for current versions of Fedora and FreeBSD [\#709](https://github.com/dev-sec/ansible-collection-hardening/pull/709) [[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))
|
||||
- feat: workflow for roles readme [\#705](https://github.com/dev-sec/ansible-collection-hardening/pull/705) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([Nemental](https://github.com/Nemental))
|
||||
- do not try to drop roles in mysql hardening [\#649](https://github.com/dev-sec/ansible-collection-hardening/pull/649) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- nginx conf.d directory is missing on Rocky Linux 8 [\#707](https://github.com/dev-sec/ansible-collection-hardening/issues/707)
|
||||
- Default value of `ssh_client_alive_interval` is inconsistent with what documentation says [\#701](https://github.com/dev-sec/ansible-collection-hardening/issues/701)
|
||||
- \[devsec.hardening.os\_hardening : restart-auditd\] fails [\#698](https://github.com/dev-sec/ansible-collection-hardening/issues/698)
|
||||
- sshd\_hardening role cannot be used to build system images [\#697](https://github.com/dev-sec/ansible-collection-hardening/issues/697)
|
||||
- Error: No file was found when using first\_found on Ubuntu 20.04 [\#676](https://github.com/dev-sec/ansible-collection-hardening/issues/676)
|
||||
- PUBLIC-role breaks mysql-hardening [\#648](https://github.com/dev-sec/ansible-collection-hardening/issues/648)
|
||||
- Error deploying the playbook [\#630](https://github.com/dev-sec/ansible-collection-hardening/issues/630)
|
||||
- Gather facts when os\_hardening role is executed with tags [\#708](https://github.com/dev-sec/ansible-collection-hardening/pull/708) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- Add send-to-mailinglist to github release action [\#434](https://github.com/dev-sec/ansible-collection-hardening/issues/434)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- update status badges in README [\#714](https://github.com/dev-sec/ansible-collection-hardening/pull/714) [[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 CI test for os\_hardening [\#711](https://github.com/dev-sec/ansible-collection-hardening/pull/711) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
|
||||
- fix nginx CI tests [\#710](https://github.com/dev-sec/ansible-collection-hardening/pull/710) [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
|
||||
- fix: roles-readme action default value [\#706](https://github.com/dev-sec/ansible-collection-hardening/pull/706) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([Nemental](https://github.com/Nemental))
|
||||
- fix some wrong defaults and types in the readmes [\#703](https://github.com/dev-sec/ansible-collection-hardening/pull/703) [[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))
|
||||
- update links to new Ansible Galaxy [\#702](https://github.com/dev-sec/ansible-collection-hardening/pull/702) [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
|
||||
- Fix typo in login.defs.j2 [\#700](https://github.com/dev-sec/ansible-collection-hardening/pull/700) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([nejch](https://github.com/nejch))
|
||||
- chore\(deps\): update actions/checkout action to v4 [\#696](https://github.com/dev-sec/ansible-collection-hardening/pull/696) [[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))
|
||||
- test debian12 on VM [\#695](https://github.com/dev-sec/ansible-collection-hardening/pull/695) ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
- fix descriptions in readme [\#693](https://github.com/dev-sec/ansible-collection-hardening/pull/693) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
- feat: customize user paths default [\#692](https://github.com/dev-sec/ansible-collection-hardening/pull/692) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([S0obi](https://github.com/S0obi))
|
||||
- disable PAM tests [\#691](https://github.com/dev-sec/ansible-collection-hardening/pull/691) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
|
||||
## [8.8.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.8.0) (2023-08-04)
|
||||
|
||||
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.7.0...8.8.0)
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- Add support for Fedora 38 [\#671](https://github.com/dev-sec/ansible-collection-hardening/issues/671)
|
||||
- auditd: add possibility to override config template [\#685](https://github.com/dev-sec/ansible-collection-hardening/pull/685) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([Meecr0b](https://github.com/Meecr0b))
|
||||
- add debian 12 support [\#684](https://github.com/dev-sec/ansible-collection-hardening/pull/684) [[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))
|
||||
- feat: explicitly support Fedora 37 and 38 [\#682](https://github.com/dev-sec/ansible-collection-hardening/pull/682) [[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)] ([nejch](https://github.com/nejch))
|
||||
- Replace ssh\_keys group with root, where applicable and use less permissive file mode [\#677](https://github.com/dev-sec/ansible-collection-hardening/pull/677) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
|
||||
- Add oddjob mkhomedir option rhel pam [\#675](https://github.com/dev-sec/ansible-collection-hardening/pull/675) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([imp1sh](https://github.com/imp1sh))
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Error: No file was found when using first\_found on Ubuntu 20.04 [\#676](https://github.com/dev-sec/ansible-collection-hardening/issues/676)
|
||||
- How does one set `sshd_authenticationmethods` to include password authentication? [\#686](https://github.com/dev-sec/ansible-collection-hardening/issues/686)
|
||||
- FreeIPA environment mkhomedir fails [\#664](https://github.com/dev-sec/ansible-collection-hardening/issues/664)
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- What is the uscase of sysctl\_overwrite over ansible.posix.sysctl? [\#683](https://github.com/dev-sec/ansible-collection-hardening/issues/683)
|
||||
- `Ensure permissions on mysql-logfile are correct` chokes when `log_error` is set to `stderr` [\#673](https://github.com/dev-sec/ansible-collection-hardening/issues/673)
|
||||
- TASK TASK FAILED: \[devsec.hardening.os\_hardening : Set password ageing for existing regular \(non-system, non-root\) accounts\] [\#670](https://github.com/dev-sec/ansible-collection-hardening/issues/670)
|
||||
- After os\_hardening ssh not working [\#663](https://github.com/dev-sec/ansible-collection-hardening/issues/663)
|
||||
@@ -51,7 +165,6 @@
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- Dependency Dashboard [\#655](https://github.com/dev-sec/ansible-collection-hardening/issues/655)
|
||||
- Invalid login.defs for RHEL6 [\#651](https://github.com/dev-sec/ansible-collection-hardening/issues/651)
|
||||
- Deprecation warnings for os\_hardening [\#638](https://github.com/dev-sec/ansible-collection-hardening/issues/638)
|
||||
- Write tests for MySQL user-deletion [\#445](https://github.com/dev-sec/ansible-collection-hardening/issues/445)
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
# Ansible Collection - devsec.hardening
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/os_hardening.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/os_hardening_vm.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_bsd.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_custom_tests.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/nginx_hardening.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/mysql_hardening.yml)
|
||||
|
||||
## Description
|
||||
|
||||
This collection provides battle tested hardening for:
|
||||
|
||||
- Linux operating systems:
|
||||
- CentOS 7
|
||||
- Rocky Linux 8
|
||||
- Debian 10/11
|
||||
- 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)
|
||||
|
||||
+4
-1
@@ -1,6 +1,6 @@
|
||||
namespace: devsec
|
||||
name: hardening
|
||||
version: 8.7.0
|
||||
version: 9.0.1
|
||||
readme: README.md
|
||||
authors:
|
||||
- dev-sec <[email protected]>
|
||||
@@ -22,6 +22,9 @@ tags:
|
||||
- nginx_hardening
|
||||
- os_hardening
|
||||
- ssh_hardening
|
||||
- database
|
||||
- linux
|
||||
- security
|
||||
dependencies:
|
||||
ansible.posix: '>=1.0.0'
|
||||
community.crypto: '>=1.0.0'
|
||||
|
||||
@@ -1,38 +1,37 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-mysql-hardening"
|
||||
- name: Wrapper playbook for kitchen testing "ansible-mysql-hardening"
|
||||
hosts: all
|
||||
become: true
|
||||
collections:
|
||||
- devsec.hardening
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Determine required MySQL Python libraries (Ubuntu Focal Fossa ++)
|
||||
set_fact:
|
||||
mysql_python_package_debian: "python3-pymysql"
|
||||
ansible.builtin.set_fact:
|
||||
mysql_python_package_debian: python3-pymysql
|
||||
when:
|
||||
- mysql_python_package_debian is not defined
|
||||
- ansible_distribution == "Ubuntu"
|
||||
- ansible_distribution_major_version|int > 19
|
||||
|
||||
- name: Determine required MySQL Python libraries.
|
||||
set_fact:
|
||||
mysql_python_package_debian: "{% if 'python3' in ansible_python_interpreter|default('') %}python3-mysqldb{% else %}python-mysqldb{% endif %}"
|
||||
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
|
||||
set_fact:
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when:
|
||||
- ansible_os_family == 'Suse'
|
||||
|
||||
- include_role:
|
||||
name: mysql_hardening
|
||||
- name: Include mysql_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.mysql_hardening
|
||||
vars:
|
||||
overwrite_global_mycnf: false
|
||||
mysql_root_password: iloverandompasswordsbutthiswilldo
|
||||
|
||||
@@ -8,7 +8,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
|
||||
image: rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||
|
||||
@@ -1,80 +1,81 @@
|
||||
---
|
||||
|
||||
- name: wrapper playbook for kitchen testing "ansible-mysql-hardening"
|
||||
- name: Wrapper playbook for kitchen testing "ansible-mysql-hardening"
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Use Python 3 on Debian 11
|
||||
set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when:
|
||||
- ansible_distribution == 'Debian'
|
||||
- ansible_distribution_major_version|int >= 11
|
||||
|
||||
- name: Use Python 3 on Suse
|
||||
set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when:
|
||||
- ansible_os_family == 'Suse'
|
||||
|
||||
- name: Use Python 2 on Debian 10
|
||||
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"
|
||||
apt:
|
||||
name: "*"
|
||||
state: latest
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'Debian'
|
||||
|
||||
- name: Install required python packages on Suse
|
||||
ansible.builtin.shell: zypper -n install python-xml python3-rpm python3-PyMySQL
|
||||
when: ansible_os_family == 'Suse'
|
||||
|
||||
- name: create missing directory
|
||||
file:
|
||||
path: "/etc/mysql/conf.d"
|
||||
state: directory
|
||||
|
||||
- name: Determine required MySQL Python libraries (Ubuntu Focal Fossa ++)
|
||||
set_fact:
|
||||
mysql_python_package_debian: "python3-pymysql"
|
||||
when:
|
||||
- mysql_python_package_debian is not defined
|
||||
- ansible_distribution == "Ubuntu"
|
||||
- ansible_distribution_major_version|int > 19
|
||||
|
||||
- name: Determine required MySQL Python libraries.
|
||||
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
|
||||
yum:
|
||||
name: "{% if 'python3' in ansible_python_interpreter|default('') %}python36-PyMySQL{% else %}python2-PyMySQL{% endif %}"
|
||||
when:
|
||||
- ansible_os_family == "RedHat"
|
||||
- ansible_distribution_major_version == "7"
|
||||
|
||||
- include_role:
|
||||
name: dev-sec.mysql
|
||||
|
||||
- name: include MySQL user prepare tasks
|
||||
include_tasks: prepare_tasks/mysql_users.yml
|
||||
vars:
|
||||
overwrite_global_mycnf: false
|
||||
mysql_root_password: iloverandompasswordsbutthiswilldo
|
||||
mysql_user_password: iloverandompasswordsbutthiswilldo
|
||||
mysql_config_file: /etc/mysql/mariadb.cnf
|
||||
mysql_root_password_update: true
|
||||
tasks:
|
||||
- name: Use Python 3 on Debian 11
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when:
|
||||
- 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_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_os_family == 'Debian'
|
||||
|
||||
- name: Install required python packages on Suse
|
||||
ansible.builtin.command: zypper -n install python-xml python3-rpm python3-PyMySQL
|
||||
changed_when: false
|
||||
when: ansible_os_family == 'Suse'
|
||||
|
||||
- name: Create missing directory
|
||||
ansible.builtin.file:
|
||||
path: /etc/mysql
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: Determine required MySQL Python libraries (Ubuntu Focal Fossa ++)
|
||||
ansible.builtin.set_fact:
|
||||
mysql_python_package_debian: python3-pymysql
|
||||
when:
|
||||
- mysql_python_package_debian is not defined
|
||||
- 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.yum:
|
||||
name: "{% if 'python3' in ansible_python_interpreter | default('') %}python36-PyMySQL{% else %}python2-PyMySQL{% endif %}"
|
||||
when:
|
||||
- ansible_os_family == "RedHat"
|
||||
- ansible_distribution_major_version == "7"
|
||||
|
||||
- name: Install mysql with a generic Ansible role
|
||||
ansible.builtin.include_role:
|
||||
name: dev-sec.mysql
|
||||
|
||||
- name: Include MySQL user prepare tasks
|
||||
ansible.builtin.include_tasks: prepare_tasks/mysql_users.yml
|
||||
@@ -1,15 +1,32 @@
|
||||
---
|
||||
- name: create users for test
|
||||
- name: Create users for test
|
||||
community.mysql.mysql_query:
|
||||
query:
|
||||
- "CREATE USER 'user'@'delete';"
|
||||
- "CREATE USER 'user'@'127.0.0.1';"
|
||||
- "CREATE USER 'user'@'::1';"
|
||||
- "CREATE USER 'user'@'%';"
|
||||
- "CREATE USER 'user'@'192.168.0.%';"
|
||||
- "CREATE USER 'user'@'192.168.0.1';"
|
||||
- "CREATE USER '%'@'192.168.0.1';"
|
||||
- "CREATE USER 'user'@'192.168.0.2' IDENTIFIED BY 'keep';"
|
||||
- "CREATE USER 'user'@'keep' IDENTIFIED BY 'keep';"
|
||||
- "CREATE USER 'user'@'192.168.%' IDENTIFIED BY 'keep';"
|
||||
- CREATE USER 'user'@'delete';
|
||||
- CREATE USER 'user'@'127.0.0.1';
|
||||
- CREATE USER 'user'@'::1';
|
||||
- CREATE USER 'user'@'%';
|
||||
- CREATE USER 'user'@'192.168.0.%';
|
||||
- CREATE USER 'user'@'192.168.0.1';
|
||||
- CREATE USER '%'@'192.168.0.1';
|
||||
- CREATE USER 'user'@'192.168.0.2' IDENTIFIED BY 'keep';
|
||||
- CREATE USER 'user'@'keep' IDENTIFIED BY 'keep';
|
||||
- CREATE USER 'user'@'192.168.%' IDENTIFIED BY 'keep';
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
|
||||
- name: Detect role support on MySQL
|
||||
community.mysql.mysql_query:
|
||||
query: >
|
||||
SELECT 1 FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'
|
||||
AND COLUMN_NAME = 'is_role';
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
register: mysql_role_support
|
||||
|
||||
- name: Create roles for test
|
||||
community.mysql.mysql_query:
|
||||
query:
|
||||
- CREATE ROLE 'role_keep';
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
when:
|
||||
- mysql_role_support.rowcount[0] > 0
|
||||
@@ -8,23 +8,23 @@
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Use Python 3 on Suse
|
||||
set_fact:
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when:
|
||||
- ansible_os_family == 'Suse'
|
||||
|
||||
- name: install procps for debian systems
|
||||
apt:
|
||||
- name: Install procps for debian systems
|
||||
ansible.builtin.apt:
|
||||
name: procps
|
||||
state: present
|
||||
update_cache: true
|
||||
when: ansible_distribution == 'Debian'
|
||||
|
||||
- name: include tests for the service
|
||||
include_tasks: verify_tasks/service.yml
|
||||
- name: Include tests for the service
|
||||
ansible.builtin.include_tasks: verify_tasks/service.yml
|
||||
|
||||
- name: include tests for MySQL user
|
||||
include_tasks: verify_tasks/mysql_users.yml
|
||||
- name: Include tests for MySQL user
|
||||
ansible.builtin.include_tasks: verify_tasks/mysql_users.yml
|
||||
|
||||
- name: Verify
|
||||
hosts: localhost
|
||||
@@ -34,7 +34,7 @@
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Execute cinc-auditor tests
|
||||
command: >
|
||||
ansible.builtin.command: >
|
||||
docker run
|
||||
--volume /run/docker.sock:/run/docker.sock
|
||||
docker.io/cincproject/auditor exec
|
||||
@@ -46,10 +46,10 @@
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display details about the cinc-auditor results
|
||||
debug:
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ test_results.stdout_lines }}"
|
||||
|
||||
- name: Fail when tests fail
|
||||
fail:
|
||||
msg: "Inspec failed to validate"
|
||||
ansible.builtin.fail:
|
||||
msg: Inspec failed to validate
|
||||
when: test_results.rc != 0
|
||||
@@ -6,11 +6,11 @@
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
register: mysql_users
|
||||
|
||||
- name: create list of users from mysql query
|
||||
set_fact:
|
||||
- name: Create list of users from mysql query
|
||||
ansible.builtin.set_fact:
|
||||
mysql_users_list: "{{ mysql_users.query_result.0 | json_query('[*].users') | list }}"
|
||||
|
||||
- name: assert that only accounts with password remain
|
||||
- name: Assert that only accounts with password remain
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- '"user@delete" not in mysql_users_list'
|
||||
@@ -23,3 +23,19 @@
|
||||
- '"[email protected]" in mysql_users_list'
|
||||
- '"user@keep" in mysql_users_list'
|
||||
- '"[email protected].%" in mysql_users_list'
|
||||
|
||||
- name: Detect role support on MySQL
|
||||
community.mysql.mysql_query:
|
||||
query: >
|
||||
SELECT 1 FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'
|
||||
AND COLUMN_NAME = 'is_role';
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
register: mysql_role_support
|
||||
|
||||
- name: Assert that roles remain
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- '"role_keep@" in mysql_users_list'
|
||||
when:
|
||||
- mysql_role_support.rowcount[0] > 0
|
||||
@@ -10,7 +10,7 @@
|
||||
ansible.builtin.service_facts:
|
||||
|
||||
- name: Check if MySQL is running and enabled
|
||||
assert:
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- "ansible_facts.services[mysql_daemon + '.service'].state == 'running'"
|
||||
- "ansible_facts.services[mysql_daemon + '.service'].status == 'enabled'"
|
||||
- ansible_facts.services[mysql_daemon + '.service'].state == 'running'
|
||||
- ansible_facts.services[mysql_daemon + '.service'].status == 'enabled'
|
||||
@@ -1,16 +1,15 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
become: true
|
||||
hosts: all
|
||||
collections:
|
||||
- devsec.hardening
|
||||
environment:
|
||||
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:
|
||||
- nginx_ppa_use: true
|
||||
- nginx_ppa_version: stable
|
||||
nginx_ppa_use: true
|
||||
nginx_ppa_version: stable
|
||||
tasks:
|
||||
- include_role:
|
||||
name: nginx_hardening
|
||||
- name: Include nginx_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.nginx_hardening
|
||||
@@ -7,7 +7,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
|
||||
image: rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
hosts: localhost
|
||||
vars:
|
||||
- nginx_main_template_enable: true
|
||||
- nginx_main_template:
|
||||
template_file: nginx.conf.j2
|
||||
conf_file_name: nginx.conf
|
||||
conf_file_location: /etc/nginx/
|
||||
user: www-data
|
||||
worker_processes: auto
|
||||
error_level: warn
|
||||
worker_connections: 1024
|
||||
http_enable: true
|
||||
http_settings:
|
||||
keepalive_timeout: 65
|
||||
cache: false
|
||||
rate_limit: false
|
||||
keyval: false
|
||||
stream_enable: false
|
||||
http_global_autoindex: false
|
||||
nginx_main_template_enable: true
|
||||
nginx_main_template:
|
||||
template_file: nginx.conf.j2
|
||||
conf_file_name: nginx.conf
|
||||
conf_file_location: /etc/nginx/
|
||||
user: www-data
|
||||
worker_processes: auto
|
||||
error_level: warn
|
||||
worker_connections: 1024
|
||||
http_enable: true
|
||||
http_settings:
|
||||
keepalive_timeout: 65
|
||||
cache: false
|
||||
rate_limit: false
|
||||
keyval: false
|
||||
stream_enable: false
|
||||
http_global_autoindex: false
|
||||
roles:
|
||||
- nginxinc.nginx
|
||||
- nginx_hardening
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
hosts: localhost
|
||||
roles:
|
||||
- nginxinc.nginx
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: prepare playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
- name: Prepare playbook for kitchen testing "ansible-nginx-hardening" with custom settings
|
||||
become: true
|
||||
hosts: all
|
||||
environment:
|
||||
@@ -7,22 +7,23 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: install required tools on SuSE
|
||||
- name: Install required tools on SuSE
|
||||
community.general.zypper:
|
||||
name: "python-xml"
|
||||
name: python-xml
|
||||
state: present
|
||||
when: ansible_facts.os_family == 'Suse'
|
||||
|
||||
- name: install required packages
|
||||
package:
|
||||
name: "python3-apt"
|
||||
- name: Install required packages
|
||||
ansible.builtin.package:
|
||||
name: python3-apt
|
||||
update_cache: true
|
||||
ignore_errors: true # noqa ignore-errors
|
||||
ignore_errors: true # noqa ignore-errors
|
||||
|
||||
- name: Set correct distribution Version for Amazon Linux
|
||||
set_fact:
|
||||
ansible.builtin.set_fact:
|
||||
ansible_distribution_major_version: 7
|
||||
when: ansible_distribution == 'Amazon'
|
||||
|
||||
- include_role:
|
||||
- name: Install nginx with a generic Ansible role
|
||||
ansible.builtin.include_role:
|
||||
name: geerlingguy.nginx
|
||||
@@ -1,3 +1,3 @@
|
||||
---
|
||||
roles:
|
||||
- geerlingguy.nginx
|
||||
- name: geerlingguy.nginx
|
||||
@@ -7,8 +7,8 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: install procps for debian systems
|
||||
apt:
|
||||
- name: Install procps for debian systems
|
||||
ansible.builtin.apt:
|
||||
name: procps
|
||||
state: present
|
||||
update_cache: true
|
||||
@@ -22,7 +22,7 @@
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Execute cinc-auditor tests
|
||||
command: >
|
||||
ansible.builtin.command: >
|
||||
docker run
|
||||
--volume /run/docker.sock:/run/docker.sock
|
||||
docker.io/cincproject/auditor exec
|
||||
@@ -34,10 +34,10 @@
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display details about the cinc-auditor results
|
||||
debug:
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ test_results.stdout_lines }}"
|
||||
|
||||
- name: Fail when tests fail
|
||||
fail:
|
||||
msg: "Inspec failed to validate"
|
||||
ansible.builtin.fail:
|
||||
msg: Inspec failed to validate
|
||||
when: test_results.rc != 0
|
||||
@@ -1,19 +1,18 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
- name: Wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
collections:
|
||||
- devsec.hardening
|
||||
tasks:
|
||||
- name: workaround for https://github.com/ansible/ansible/issues/66304
|
||||
set_fact:
|
||||
ansible_virtualization_type: "docker"
|
||||
- include_role:
|
||||
name: os_hardening
|
||||
- name: Workaround for https://github.com/ansible/ansible/issues/66304
|
||||
ansible.builtin.set_fact:
|
||||
ansible_virtualization_type: docker
|
||||
- name: Include os_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.os_hardening
|
||||
vars:
|
||||
os_security_users_allow: change_user
|
||||
os_security_kernel_enable_core_dump: false
|
||||
@@ -22,17 +21,17 @@
|
||||
os_auth_pam_passwdqc_enable: false
|
||||
os_auth_lockout_time: 15
|
||||
os_desktop_enable: true
|
||||
os_env_extra_user_paths: ['/home']
|
||||
os_env_extra_user_paths: [/home]
|
||||
os_auth_allow_homeless: true
|
||||
os_security_suid_sgid_blacklist: ['/bin/umount']
|
||||
os_security_suid_sgid_whitelist: ['/usr/bin/rlogin']
|
||||
os_security_suid_sgid_blacklist: [/bin/umount]
|
||||
os_security_suid_sgid_whitelist: [/usr/bin/rlogin]
|
||||
os_filesystem_whitelist: []
|
||||
os_yum_repo_file_whitelist: ['foo.repo']
|
||||
os_users_without_password_ageing: ['pw_no_ageing']
|
||||
os_yum_repo_file_whitelist: [foo.repo]
|
||||
os_users_without_password_ageing: [pw_no_ageing]
|
||||
os_auth_pw_warn_age: 7
|
||||
os_netrc_enabled: false
|
||||
os_ignore_users: ["shell_sys_acc"]
|
||||
os_ignore_home_folder_users: ["user_with_777_home"]
|
||||
os_ignore_users: [shell_sys_acc]
|
||||
os_ignore_home_folder_users: [user_with_777_home]
|
||||
sysctl_config:
|
||||
net.ipv4.ip_forward: 0
|
||||
net.ipv6.conf.all.forwarding: 0
|
||||
@@ -73,8 +72,6 @@
|
||||
# - name: wrapper playbook for kitchen testing "ansible-os-hardening"
|
||||
# hosts: all
|
||||
# become: true
|
||||
# collections:
|
||||
# - devsec.hardening
|
||||
# vars:
|
||||
# os_auditd_enabled: false
|
||||
# tasks:
|
||||
@@ -84,9 +81,9 @@
|
||||
# when: ansible_facts.distribution == 'Fedora'
|
||||
#
|
||||
# - name: Run the equivalent of "apt-get update" as a separate step
|
||||
# apt:
|
||||
# ansible.builtin.apt:
|
||||
# update_cache: yes
|
||||
# when: ansible_facts.os_family == 'Debian'
|
||||
#
|
||||
# - include_role:
|
||||
# name: os_hardening
|
||||
# name: devsec.hardening.os_hardening
|
||||
@@ -3,7 +3,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
|
||||
image: rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
- name: Wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
@@ -7,32 +7,32 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: set ansible_python_interpreter to "/usr/bin/python3" on fedora
|
||||
set_fact:
|
||||
ansible_python_interpreter: "/usr/bin/python3"
|
||||
- name: Set ansible_python_interpreter to "/usr/bin/python3" on fedora
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: Run the equivalent of "apt-get update && apt-get upgrade"
|
||||
apt:
|
||||
name: "*"
|
||||
state: latest
|
||||
ansible.builtin.apt:
|
||||
upgrade: safe
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'Debian'
|
||||
|
||||
- name: install required tools on SuSE
|
||||
- name: Install required tools on SuSE
|
||||
# cannot use zypper module, since it depends on python-xml
|
||||
shell: "zypper -n install python-xml"
|
||||
ansible.builtin.command: zypper -n install python-xml awk
|
||||
changed_when: false
|
||||
when: ansible_facts.os_family == 'Suse'
|
||||
|
||||
- name: install required tools on fedora
|
||||
dnf:
|
||||
- name: Install required tools on fedora
|
||||
ansible.builtin.dnf:
|
||||
name:
|
||||
- python
|
||||
- findutils
|
||||
- procps-ng
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: install required tools on Arch
|
||||
- name: Install required tools on Arch
|
||||
community.general.pacman:
|
||||
name:
|
||||
- awk
|
||||
@@ -40,8 +40,8 @@
|
||||
update_cache: true
|
||||
when: ansible_facts.os_family == 'Archlinux'
|
||||
|
||||
- name: install required tools on RHEL # noqa ignore-errors
|
||||
yum:
|
||||
- name: Install required tools on RHEL # noqa ignore-errors
|
||||
ansible.builtin.yum:
|
||||
name:
|
||||
- openssh-clients
|
||||
- openssh
|
||||
@@ -49,15 +49,15 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: create recursing symlink to test minimize access
|
||||
shell: "rm -f /usr/bin/zzz && ln -s /usr/bin /usr/bin/zzz"
|
||||
- name: Create recursing symlink to test minimize access
|
||||
ansible.builtin.shell: rm -f /usr/bin/zzz && ln -s /usr/bin /usr/bin/zzz
|
||||
changed_when: false
|
||||
|
||||
- name: include YUM prepare tasks
|
||||
include_tasks: prepare_tasks/yum.yml
|
||||
- name: Include YUM prepare tasks
|
||||
ansible.builtin.include_tasks: prepare_tasks/yum.yml
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: include preparation tasks
|
||||
- name: Include preparation tasks
|
||||
ansible.builtin.include_tasks:
|
||||
file: "{{ item }}"
|
||||
loop:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
- name: Create user whose home-folder should not be touched
|
||||
ansible.builtin.user:
|
||||
name: "user_with_777_home"
|
||||
name: user_with_777_home
|
||||
|
||||
- name: Change mode of home-folder for user to 777
|
||||
ansible.builtin.file:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
- name: create '.netrc' in /root
|
||||
ansible.builtin.copy:
|
||||
dest: '/root/.netrc'
|
||||
mode: '0600'
|
||||
dest: /root/.netrc
|
||||
mode: "0600"
|
||||
content: |
|
||||
machine localhost
|
||||
login root
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
---
|
||||
- name: Create user those password ageing should not be changed
|
||||
user:
|
||||
name: "pw_no_ageing"
|
||||
password: "$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1"
|
||||
name: pw_no_ageing
|
||||
password: $6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1
|
||||
|
||||
- name: Create user those password ageing should be changed
|
||||
user:
|
||||
name: "pw_ageing"
|
||||
password: "$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1"
|
||||
name: pw_ageing
|
||||
password: $6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: Create system user with shell that should keep it
|
||||
user:
|
||||
name: "shell_sys_acc"
|
||||
shell: "/bin/bash"
|
||||
name: shell_sys_acc
|
||||
shell: /bin/bash
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: create 'foo' repository
|
||||
- name: Create 'foo' repository
|
||||
ansible.builtin.yum_repository:
|
||||
name: foo
|
||||
description: mandatory description
|
||||
@@ -7,7 +7,7 @@
|
||||
enabled: false
|
||||
gpgcheck: false
|
||||
|
||||
- name: create 'bar' repository
|
||||
- name: Create 'bar' repository
|
||||
ansible.builtin.yum_repository:
|
||||
name: bar
|
||||
description: mandatory description
|
||||
|
||||
@@ -7,21 +7,27 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: include verification tasks
|
||||
- name: Set ansible_python_interpreter to "/usr/bin/python3"
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: Include verification tasks
|
||||
ansible.builtin.include_tasks:
|
||||
file: "{{ item }}"
|
||||
loop:
|
||||
loop:
|
||||
- verify_tasks/sys_account_shell.yml
|
||||
- verify_tasks/pw_ageing.yml
|
||||
- verify_tasks/netrc.yml
|
||||
- verify_tasks/ignore_home_folders.yml
|
||||
|
||||
- name: include PAM tests
|
||||
include_tasks: verify_tasks/pam.yml
|
||||
when: ansible_facts.distribution in ['Debian', 'Ubuntu'] or ansible_facts.os_family == 'RedHat'
|
||||
# temp. disabled - https://github.com/dev-sec/ansible-collection-hardening/issues/690
|
||||
# - name: Include PAM tests
|
||||
# ansible.builtin.include_tasks: verify_tasks/pam.yml
|
||||
# when: ansible_facts.distribution in ['Debian', 'Ubuntu'] or ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: include YUM tests
|
||||
include_tasks: verify_tasks/yum.yml
|
||||
- name: Include YUM tests
|
||||
ansible.builtin.include_tasks: verify_tasks/yum.yml
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Verify
|
||||
@@ -32,7 +38,7 @@
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Execute cinc-auditor tests
|
||||
command: >
|
||||
ansible.builtin.command: >
|
||||
docker run
|
||||
--volume /run/docker.sock:/run/docker.sock
|
||||
--volume {{ playbook_dir }}/waivers.yaml:/waivers.yaml
|
||||
@@ -46,12 +52,12 @@
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display details about the cinc-auditor results
|
||||
debug:
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ test_results.stdout_lines }}"
|
||||
|
||||
- name: Fail when tests fail
|
||||
fail:
|
||||
msg: "Inspec failed to validate"
|
||||
ansible.builtin.fail:
|
||||
msg: Inspec failed to validate
|
||||
when: test_results.rc != 0
|
||||
|
||||
- name: Verify
|
||||
@@ -61,19 +67,18 @@
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
collections:
|
||||
- devsec.hardening
|
||||
tasks:
|
||||
# test if variable can be overridden
|
||||
- name: workaround for https://github.com/ansible/ansible/issues/66304
|
||||
set_fact:
|
||||
ansible_virtualization_type: "docker"
|
||||
- name: Workaround for https://github.com/ansible/ansible/issues/66304
|
||||
ansible.builtin.set_fact:
|
||||
ansible_virtualization_type: docker
|
||||
os_env_umask: "027 #override"
|
||||
|
||||
- include_role:
|
||||
name: os_hardening
|
||||
- name: Include os_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.os_hardening
|
||||
|
||||
- name: verify os_env_umask
|
||||
shell:
|
||||
- name: Verify os_env_umask
|
||||
ansible.builtin.command:
|
||||
cmd: "grep '027 #override' /etc/login.defs"
|
||||
changed_when: false
|
||||
@@ -1,19 +1,19 @@
|
||||
---
|
||||
- name: test that .netrc in root homedir exists
|
||||
- name: Test that .netrc in root homedir exists
|
||||
ansible.builtin.file:
|
||||
path: '/root/.netrc'
|
||||
path: /root/.netrc
|
||||
state: file
|
||||
register: result_test_netrc
|
||||
|
||||
- name: output result if .netrc for user root exists
|
||||
- name: Output result if .netrc for user root exists
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- "result_test_netrc.state == 'file'"
|
||||
fail_msg: ".netrc in /root/ not present"
|
||||
success_msg: ".netrc exists in /root/"
|
||||
- result_test_netrc.state == 'file'
|
||||
fail_msg: .netrc in /root/ not present
|
||||
success_msg: .netrc exists in /root/
|
||||
|
||||
- name: delete '.netrc' in /root
|
||||
- name: Delete '.netrc' in /root
|
||||
ansible.builtin.file:
|
||||
path: '/root/.netrc'
|
||||
path: /root/.netrc
|
||||
state: absent
|
||||
when: result_test_netrc.state == 'file'
|
||||
@@ -1,17 +1,24 @@
|
||||
---
|
||||
- name: download pam-tester
|
||||
get_url:
|
||||
url: https://github.com/schurzi/pam-tester/releases/download/latest/pam-tester
|
||||
dest: /bin/pam-tester
|
||||
mode: 0555
|
||||
- name: install pip
|
||||
package:
|
||||
name:
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
state: present
|
||||
|
||||
- name: install pam-tester
|
||||
ansible.builtin.pip:
|
||||
name: pam-tester
|
||||
state: present
|
||||
executable: /usr/bin/pip3
|
||||
|
||||
- name: set password for test
|
||||
set_fact:
|
||||
test_pw: "myTest!pw"
|
||||
ansible.builtin.set_fact:
|
||||
test_pw: myTest!pw
|
||||
|
||||
- name: set locale for test
|
||||
set_fact:
|
||||
locale: "en_US.UTF-8"
|
||||
ansible.builtin.set_fact:
|
||||
locale: en_US.UTF-8
|
||||
when:
|
||||
- ansible_facts.os_family == 'RedHat'
|
||||
- ansible_facts.distribution_major_version < '8'
|
||||
@@ -22,16 +29,16 @@
|
||||
password: "{{ test_pw | password_hash('sha512') }}"
|
||||
|
||||
- name: check successful login with correct password
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }}"
|
||||
ansible.builtin.shell:
|
||||
cmd: /usr/local/bin/pam-tester --user testuser --password {{ test_pw }}
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
LANG: "{{ locale | default('C.UTF-8') }}"
|
||||
|
||||
- name: check unsuccessful login with incorrect password
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }}fail --expectfail"
|
||||
ansible.builtin.shell:
|
||||
cmd: /usr/local/bin/pam-tester --user testuser --password {{ test_pw }}fail --expectfail
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
@@ -39,8 +46,8 @@
|
||||
with_sequence: count=6
|
||||
|
||||
- name: check unsuccessful login, with correct password (lockout)
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }} --expectfail"
|
||||
ansible.builtin.shell:
|
||||
cmd: /usr/local/bin/pam-tester --user testuser --password {{ test_pw }} --expectfail
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
@@ -51,8 +58,8 @@
|
||||
seconds: 20
|
||||
|
||||
- name: check successful login
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }}"
|
||||
ansible.builtin.shell:
|
||||
cmd: /usr/local/bin/pam-tester --user testuser --password {{ test_pw }}
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
- name: Check that the expiry date of pw_no_ageing is "never"
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- "expiry_date.stdout | trim == 'never'"
|
||||
- expiry_date.stdout | trim == 'never'
|
||||
|
||||
- name: Get Password Expiry date for pw_ageing
|
||||
ansible.builtin.shell: chage -l pw_ageing | grep "Password expires" | cut -d ":" -f 2
|
||||
@@ -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_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
|
||||
@@ -29,4 +29,4 @@
|
||||
- name: Check that number of days of warning before password expires is 7 days
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- "expiry_warndays.stdout | trim == '7'"
|
||||
- expiry_warndays.stdout | trim == '7'
|
||||
@@ -1,8 +1,9 @@
|
||||
---
|
||||
- name: Read local linux user database
|
||||
getent:
|
||||
database: passwd
|
||||
|
||||
- name: Check that shell_sys_acc's shell is still bash
|
||||
assert:
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- getent_passwd['shell_sys_acc'][5] == "/bin/bash"
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
- name: verify 'gpgcheck' was not enabled for 'foo' repository (in whitelist)
|
||||
command: grep -e 'gpgcheck\s*=\s*0' /etc/yum.repos.d/foo.repo
|
||||
- name: Verify 'gpgcheck' was not enabled for 'foo' repository (in whitelist)
|
||||
ansible.builtin.command: grep -e 'gpgcheck\s*=\s*0' /etc/yum.repos.d/foo.repo
|
||||
changed_when: false
|
||||
|
||||
- name: verify 'gpgcheck' was enabled for 'bar' repository (not in whitelist)
|
||||
command: grep -e 'gpgcheck\s*=\s*1' /etc/yum.repos.d/bar.repo
|
||||
- name: Verify 'gpgcheck' was enabled for 'bar' repository (not in whitelist)
|
||||
ansible.builtin.command: grep -e 'gpgcheck\s*=\s*1' /etc/yum.repos.d/bar.repo
|
||||
changed_when: false
|
||||
@@ -1,23 +1,32 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
- name: Wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
collections:
|
||||
- devsec.hardening
|
||||
tasks:
|
||||
- name: override for arch
|
||||
set_fact:
|
||||
- name: Override for arch
|
||||
ansible.builtin.set_fact:
|
||||
os_mnt_boot_enabled: false
|
||||
os_mnt_tmp_enabled: true
|
||||
os_mnt_tmp_src: tmpfs
|
||||
os_mnt_tmp_filesystem: tmpfs
|
||||
when: ansible_facts.os_family == 'Archlinux'
|
||||
- include_role:
|
||||
name: os_hardening
|
||||
- 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: Include os_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.os_hardening
|
||||
vars:
|
||||
os_auth_pam_passwdqc_enable: false
|
||||
os_auth_lockout_time: 15
|
||||
os_yum_repo_file_whitelist: ['foo.repo']
|
||||
os_yum_repo_file_whitelist: [foo.repo]
|
||||
os_mnt_boot_enabled: true
|
||||
os_mnt_boot_src: "/dev/vda1"
|
||||
os_mnt_home_enabled: true
|
||||
os_mnt_boot_src: /dev/vda1
|
||||
@@ -2,7 +2,7 @@
|
||||
dependency:
|
||||
name: galaxy
|
||||
options:
|
||||
role-file: molecule/os_hardening/requirements.yml
|
||||
role-file: molecule/os_hardening_vm/requirements.yml
|
||||
driver:
|
||||
name: vagrant
|
||||
provider:
|
||||
@@ -11,8 +11,8 @@ platforms:
|
||||
# we need to name every instance differently to start multiple VMs on the same host (parallelization)
|
||||
# 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: "generic/${MOLECULE_DISTRO}"
|
||||
- name: ${USER}
|
||||
box: ${MOLECULE_DISTRO}
|
||||
memory: 1024
|
||||
cpus: 2
|
||||
provisioner:
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
- name: Prepare Archliux host
|
||||
hosts: all
|
||||
become: true
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- name: Install python, since it's not installed by default
|
||||
ansible.builtin.raw: pacman --noconfirm -Sy python
|
||||
changed_when: false
|
||||
when: lookup('env', 'MOLECULE_DISTRO') == 'generic/arch'
|
||||
|
||||
- name: Wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
@@ -7,30 +17,54 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: set ansible_python_interpreter to "/usr/bin/python3" on fedora
|
||||
set_fact:
|
||||
ansible_python_interpreter: "/usr/bin/python3"
|
||||
- name: Set ansible_python_interpreter to "/usr/bin/python3" on fedora
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: Block update of Grub, because of error
|
||||
ansible.builtin.dpkg_selections:
|
||||
name: grub-pc
|
||||
selection: hold
|
||||
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
|
||||
- name: Find all initrd.img to delete them
|
||||
ansible.builtin.find:
|
||||
paths: /boot
|
||||
patterns: "initrd.img*"
|
||||
register: find_results
|
||||
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_os_family == 'Debian'
|
||||
|
||||
- name: Run the equivalent of "apt-get update && apt-get upgrade"
|
||||
apt:
|
||||
ansible.builtin.apt:
|
||||
upgrade: safe
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'Debian'
|
||||
|
||||
- name: install required tools on SuSE
|
||||
- name: Install required tools on SuSE
|
||||
# cannot use zypper module, since it depends on python-xml
|
||||
shell: "zypper -n install 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
|
||||
dnf:
|
||||
- name: Install required tools on fedora
|
||||
ansible.builtin.dnf:
|
||||
name:
|
||||
- python
|
||||
- findutils
|
||||
- procps-ng
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: install required tools on Arch
|
||||
- name: Install required tools on Arch
|
||||
community.general.pacman:
|
||||
name:
|
||||
- awk
|
||||
@@ -38,8 +72,8 @@
|
||||
update_cache: true
|
||||
when: ansible_facts.os_family == 'Archlinux'
|
||||
|
||||
- name: install required tools on RHEL # noqa ignore-errors
|
||||
yum:
|
||||
- name: Install required tools on RHEL # noqa ignore-errors
|
||||
ansible.builtin.yum:
|
||||
name:
|
||||
- openssh-clients
|
||||
- openssh
|
||||
@@ -47,10 +81,16 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: create recursing symlink to test minimize access
|
||||
shell: "rm -f /usr/bin/zzz && ln -s /usr/bin /usr/bin/zzz"
|
||||
- name: Create recursing symlink to test minimize access
|
||||
ansible.builtin.shell: rm -f /usr/bin/zzz && ln -s /usr/bin /usr/bin/zzz
|
||||
changed_when: false
|
||||
|
||||
- name: include YUM prepare tasks
|
||||
include_tasks: prepare_tasks/yum.yml
|
||||
- name: Unmount EFI partition to get rid of vfat filesystem (qemu has no firmware image that inspec can detect)
|
||||
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
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: create 'foo' repository
|
||||
- name: Create 'foo' repository
|
||||
ansible.builtin.yum_repository:
|
||||
name: foo
|
||||
description: mandatory description
|
||||
@@ -7,7 +7,7 @@
|
||||
enabled: false
|
||||
gpgcheck: false
|
||||
|
||||
- name: create 'bar' repository
|
||||
- name: Create 'bar' repository
|
||||
ansible.builtin.yum_repository:
|
||||
name: bar
|
||||
description: mandatory description
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
---
|
||||
roles:
|
||||
- geerlingguy.git
|
||||
- name: geerlingguy.git
|
||||
@@ -7,13 +7,13 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
# temp. disabled - https://github.com/dev-sec/ansible-collection-hardening/issues/690
|
||||
# - name: Include PAM tests
|
||||
# ansible.builtin.include_tasks: verify_tasks/pam.yml
|
||||
# when: ansible_facts.distribution in ['Debian', 'Ubuntu'] or ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: include PAM tests
|
||||
include_tasks: verify_tasks/pam.yml
|
||||
when: ansible_facts.distribution in ['Debian', 'Ubuntu'] or ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: include YUM tests
|
||||
include_tasks: verify_tasks/yum.yml
|
||||
- name: Include YUM tests
|
||||
ansible.builtin.include_tasks: verify_tasks/yum.yml
|
||||
when: ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Verify
|
||||
@@ -23,22 +23,23 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: get ssh-config
|
||||
command:
|
||||
cmd: "vagrant ssh-config"
|
||||
- name: Get ssh-config
|
||||
ansible.builtin.command:
|
||||
cmd: vagrant ssh-config
|
||||
chdir: "{{ molecule_ephemeral_directory }}"
|
||||
register: ssh_config
|
||||
changed_when: false
|
||||
|
||||
- name: create ssh-config file
|
||||
copy:
|
||||
- name: Create ssh-config file
|
||||
ansible.builtin.copy:
|
||||
content: "{{ ssh_config.stdout_lines | join ('\n') }}"
|
||||
dest: "{{ molecule_ephemeral_directory }}/ssh-config"
|
||||
mode: "0400"
|
||||
changed_when: false
|
||||
|
||||
- name: Execute cinc-auditor tests
|
||||
command: >
|
||||
docker run
|
||||
ansible.builtin.command: >
|
||||
docker run --rm
|
||||
--volume {{ molecule_ephemeral_directory }}:{{ molecule_ephemeral_directory }}
|
||||
docker.io/cincproject/auditor exec
|
||||
--ssh-config-file={{ molecule_ephemeral_directory }}/ssh-config
|
||||
@@ -50,10 +51,10 @@
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display details about the cinc-auditor results
|
||||
debug:
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ test_results.stdout_lines }}"
|
||||
|
||||
- name: Fail when tests fail
|
||||
fail:
|
||||
msg: "Inspec failed to validate"
|
||||
ansible.builtin.fail:
|
||||
msg: Inspec failed to validate
|
||||
when: test_results.rc != 0
|
||||
@@ -1,17 +1,23 @@
|
||||
---
|
||||
- name: download pam-tester
|
||||
get_url:
|
||||
url: https://github.com/schurzi/pam-tester/releases/download/latest/pam-tester
|
||||
dest: /bin/pam-tester
|
||||
mode: 0555
|
||||
- name: install pip
|
||||
package:
|
||||
name:
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
state: present
|
||||
|
||||
- name: install pam-tester
|
||||
ansible.builtin.pip:
|
||||
name: pam-tester
|
||||
state: present
|
||||
|
||||
- name: set password for test
|
||||
set_fact:
|
||||
test_pw: "myTest!pw"
|
||||
ansible.builtin.set_fact:
|
||||
test_pw: myTest!pw
|
||||
|
||||
- name: set locale for test
|
||||
set_fact:
|
||||
locale: "en_US.UTF-8"
|
||||
ansible.builtin.set_fact:
|
||||
locale: en_US.UTF-8
|
||||
when:
|
||||
- ansible_facts.os_family == 'RedHat'
|
||||
- ansible_facts.distribution_major_version < '8'
|
||||
@@ -22,16 +28,16 @@
|
||||
password: "{{ test_pw | password_hash('sha512') }}"
|
||||
|
||||
- name: check successful login with correct password
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }}"
|
||||
ansible.builtin.shell:
|
||||
cmd: pam-tester --user testuser --password {{ test_pw }}
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
LANG: "{{ locale | default('C.UTF-8') }}"
|
||||
|
||||
- name: check unsuccessful login with incorrect password
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }}fail --expectfail"
|
||||
ansible.builtin.shell:
|
||||
cmd: pam-tester --user testuser --password {{ test_pw }}fail --expectfail
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
@@ -39,8 +45,8 @@
|
||||
with_sequence: count=6
|
||||
|
||||
- name: check unsuccessful login, with correct password (lockout)
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }} --expectfail"
|
||||
ansible.builtin.shell:
|
||||
cmd: pam-tester --user testuser --password {{ test_pw }} --expectfail
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
@@ -51,8 +57,8 @@
|
||||
seconds: 20
|
||||
|
||||
- name: check successful login
|
||||
shell:
|
||||
cmd: "pam-tester --user testuser --password {{ test_pw }}"
|
||||
ansible.builtin.shell:
|
||||
cmd: pam-tester --user testuser --password {{ test_pw }}
|
||||
environment:
|
||||
TMPDIR: /var/tmp
|
||||
LC_ALL: "{{ locale | default('C.UTF-8') }}"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
- name: verify 'gpgcheck' was not enabled for 'foo' repository (in whitelist)
|
||||
command: grep -e 'gpgcheck\s*=\s*0' /etc/yum.repos.d/foo.repo
|
||||
- name: Verify 'gpgcheck' was not enabled for 'foo' repository (in whitelist)
|
||||
ansible.builtin.command: grep -e 'gpgcheck\s*=\s*0' /etc/yum.repos.d/foo.repo
|
||||
changed_when: false
|
||||
|
||||
- name: verify 'gpgcheck' was enabled for 'bar' repository (not in whitelist)
|
||||
command: grep -e 'gpgcheck\s*=\s*1' /etc/yum.repos.d/bar.repo
|
||||
- name: Verify 'gpgcheck' was enabled for 'bar' repository (not in whitelist)
|
||||
ansible.builtin.command: grep -e 'gpgcheck\s*=\s*1' /etc/yum.repos.d/bar.repo
|
||||
changed_when: false
|
||||
@@ -1,14 +1,13 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
hosts: all
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
collections:
|
||||
- devsec.hardening
|
||||
tasks:
|
||||
- include_role:
|
||||
name: ssh_hardening
|
||||
- name: Include ssh_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.ssh_hardening
|
||||
vars:
|
||||
sftp_enabled: false
|
||||
@@ -3,7 +3,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
|
||||
image: rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
@@ -7,13 +7,13 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: use python3
|
||||
set_fact:
|
||||
- name: Use python3
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: install packages # noqa ignore-errors
|
||||
yum:
|
||||
- name: Install packages # noqa ignore-errors
|
||||
ansible.builtin.yum:
|
||||
name:
|
||||
- openssh-clients
|
||||
- openssh-server
|
||||
@@ -22,8 +22,8 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: install packages # noqa ignore-errors
|
||||
dnf:
|
||||
- name: Install packages # noqa ignore-errors
|
||||
ansible.builtin.dnf:
|
||||
name:
|
||||
- openssh-clients
|
||||
- openssh-server
|
||||
@@ -32,8 +32,8 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: install packages # noqa ignore-errors
|
||||
apt:
|
||||
- name: Install packages # noqa ignore-errors
|
||||
ansible.builtin.apt:
|
||||
name:
|
||||
- openssh-client
|
||||
- openssh-server
|
||||
@@ -41,19 +41,20 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: install required tools on SuSE
|
||||
- name: Install required tools on SuSE
|
||||
# cannot use zypper module, since it depends on python-xml
|
||||
shell: "zypper -n install python-xml"
|
||||
ansible.builtin.command: zypper -n install python-xml
|
||||
changed_when: false
|
||||
when: ansible_facts.os_family == 'Suse'
|
||||
|
||||
- name: install packages
|
||||
zypper:
|
||||
- name: Install packages
|
||||
community.general.zypper:
|
||||
name:
|
||||
- "openssh"
|
||||
- openssh
|
||||
when: ansible_facts.os_family == 'Suse'
|
||||
|
||||
- name: install required tools on Arch
|
||||
pacman:
|
||||
- name: Install required tools on Arch
|
||||
community.general.pacman:
|
||||
name:
|
||||
- openssh
|
||||
- awk
|
||||
@@ -61,16 +62,17 @@
|
||||
update_cache: true
|
||||
when: ansible_facts.os_family == 'Archlinux'
|
||||
|
||||
- name: created needed directory
|
||||
file:
|
||||
path: "/var/run/sshd"
|
||||
- name: Created needed directory
|
||||
ansible.builtin.file:
|
||||
path: /var/run/sshd
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: create ssh host keys # noqa ignore-errors
|
||||
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"
|
||||
- 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
|
||||
@@ -7,7 +7,7 @@
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: Execute cinc-auditor tests
|
||||
command: >
|
||||
ansible.builtin.command: >
|
||||
docker run
|
||||
--volume /run/docker.sock:/run/docker.sock
|
||||
docker.io/cincproject/auditor exec
|
||||
@@ -19,10 +19,10 @@
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display details about the cinc-auditor results
|
||||
debug:
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ test_results.stdout_lines }}"
|
||||
|
||||
- name: Fail when tests fail
|
||||
fail:
|
||||
msg: "Inspec failed to validate"
|
||||
ansible.builtin.fail:
|
||||
msg: Inspec failed to validate
|
||||
when: test_results.rc != 0
|
||||
@@ -1,14 +1,13 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
hosts: all
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
collections:
|
||||
- devsec.hardening
|
||||
tasks:
|
||||
- include_role:
|
||||
name: ssh_hardening
|
||||
- name: Include ssh_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.ssh_hardening
|
||||
vars:
|
||||
sftp_enabled: false
|
||||
@@ -7,8 +7,8 @@ platforms:
|
||||
# we need to name every instance differently to start multiple VMs on the same host (parallelization)
|
||||
# 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: "generic/${MOLECULE_DISTRO}"
|
||||
- name: ${USER}
|
||||
box: generic/${MOLECULE_DISTRO}
|
||||
memory: 1024
|
||||
cpus: 2
|
||||
provisioner:
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
---
|
||||
- name: prepare OpenBSD host
|
||||
- name: Prepare OpenBSD host
|
||||
hosts: all
|
||||
become: true
|
||||
gather_facts: false
|
||||
tasks:
|
||||
- name: install python
|
||||
- name: Install python
|
||||
# BSDs are special for Ansible - https://docs.ansible.com/ansible/latest/os_guide/intro_bsd.html
|
||||
raw: "pkg_add python%3.10"
|
||||
when: "lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'"
|
||||
ansible.builtin.raw: pkg_add python%3.10
|
||||
changed_when: false
|
||||
when: lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'
|
||||
|
||||
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
@@ -17,16 +18,17 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: created needed directory
|
||||
file:
|
||||
path: "/var/run/sshd"
|
||||
- name: Created needed directory
|
||||
ansible.builtin.file:
|
||||
path: /var/run/sshd
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: create ssh host keys # noqa ignore-errors
|
||||
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"
|
||||
- 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
|
||||
@@ -3,12 +3,13 @@
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
- name: use the type command instead of which to detect existing commands
|
||||
file:
|
||||
src: "/usr/bin/which"
|
||||
dest: "/usr/bin/type"
|
||||
- name: Use the type command instead of which to detect existing commands
|
||||
ansible.builtin.file:
|
||||
src: /usr/bin/which
|
||||
dest: /usr/bin/type
|
||||
state: hard
|
||||
when: "lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'"
|
||||
mode: "0770"
|
||||
when: lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'
|
||||
|
||||
- name: Verify
|
||||
hosts: localhost
|
||||
@@ -17,22 +18,23 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: get ssh-config
|
||||
command:
|
||||
cmd: "vagrant ssh-config"
|
||||
- name: Get ssh-config
|
||||
ansible.builtin.command:
|
||||
cmd: vagrant ssh-config
|
||||
chdir: "{{ molecule_ephemeral_directory }}"
|
||||
register: ssh_config
|
||||
changed_when: false
|
||||
|
||||
- name: create ssh-config file
|
||||
copy:
|
||||
- name: Create ssh-config file
|
||||
ansible.builtin.copy:
|
||||
content: "{{ ssh_config.stdout_lines | join ('\n') }}"
|
||||
dest: "{{ molecule_ephemeral_directory }}/ssh-config"
|
||||
mode: "0400"
|
||||
changed_when: false
|
||||
|
||||
- name: Execute cinc-auditor tests
|
||||
command: >
|
||||
docker run
|
||||
ansible.builtin.command: >
|
||||
docker run --rm
|
||||
--volume {{ molecule_ephemeral_directory }}:{{ molecule_ephemeral_directory }}
|
||||
--volume ./waivers_{{ lookup('env', 'MOLECULE_DISTRO') }}.yaml:/waivers.yaml
|
||||
docker.io/cincproject/auditor exec
|
||||
@@ -46,10 +48,10 @@
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display details about the cinc-auditor results
|
||||
debug:
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ test_results.stdout_lines }}"
|
||||
|
||||
- name: Fail when tests fail
|
||||
fail:
|
||||
msg: "Inspec failed to validate"
|
||||
ansible.builtin.fail:
|
||||
msg: Inspec failed to validate
|
||||
when: test_results.rc != 0
|
||||
@@ -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"
|
||||
@@ -1,49 +1,43 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with custom settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with custom settings
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
collections:
|
||||
- devsec.hardening
|
||||
tasks:
|
||||
- include_role:
|
||||
name: ssh_hardening
|
||||
- name: Include ssh_hardening role
|
||||
ansible.builtin.include_role:
|
||||
name: devsec.hardening.ssh_hardening
|
||||
vars:
|
||||
ssh_trusted_user_ca_keys_file: '/etc/ssh/ca.pub'
|
||||
ssh_trusted_user_ca_keys_file: /etc/ssh/ca.pub
|
||||
ssh_trusted_user_ca_keys:
|
||||
- '# ssh-rsa ...'
|
||||
ssh_authorized_principals_file: '/etc/ssh/auth_principals/%u'
|
||||
- "# ssh-rsa ..."
|
||||
ssh_authorized_principals_file: /etc/ssh/auth_principals/%u
|
||||
ssh_authorized_principals:
|
||||
- path: "/etc/ssh/auth_principals/root"
|
||||
- path: /etc/ssh/auth_principals/root
|
||||
principals:
|
||||
- "root"
|
||||
owner: "{{ ssh_owner }}"
|
||||
group: "{{ ssh_group }}"
|
||||
directoryowner: "{{ ssh_owner }}"
|
||||
directorygroup: "{{ ssh_group }}"
|
||||
directorymode: "0700"
|
||||
- root
|
||||
network_ipv6_enable: true
|
||||
ssh_allow_tcp_forwarding: 'yes'
|
||||
ssh_allow_tcp_forwarding: "yes"
|
||||
ssh_gateway_ports: true
|
||||
ssh_allow_agent_forwarding: true
|
||||
ssh_server_permit_environment_vars: 'yes'
|
||||
ssh_server_accept_env_vars: 'PWD HTTP_PROXY'
|
||||
ssh_server_permit_environment_vars: "yes"
|
||||
ssh_server_accept_env_vars: PWD HTTP_PROXY
|
||||
ssh_client_alive_interval: 100
|
||||
ssh_client_alive_count: 10
|
||||
ssh_client_password_login: true
|
||||
ssh_challengeresponseauthentication: true
|
||||
ssh_compression: true
|
||||
ssh_allow_users: 'root kitchen vagrant'
|
||||
ssh_allow_groups: 'root kitchen vagrant'
|
||||
ssh_deny_users: 'foo bar'
|
||||
ssh_deny_groups: 'foo bar'
|
||||
ssh_authorized_keys_file: '/etc/ssh/authorized_keys/%u'
|
||||
ssh_allow_users: root kitchen vagrant
|
||||
ssh_allow_groups: root kitchen vagrant
|
||||
ssh_deny_users: foo bar
|
||||
ssh_deny_groups: foo bar
|
||||
ssh_authorized_keys_file: /etc/ssh/authorized_keys/%u
|
||||
ssh_max_auth_retries: 10
|
||||
ssh_permit_root_login: "without-password"
|
||||
ssh_permit_tunnel: true
|
||||
ssh_permit_root_login: without-password
|
||||
ssh_permit_tunnel: "yes"
|
||||
ssh_print_motd: true
|
||||
ssh_print_last_log: true
|
||||
ssh_banner: true
|
||||
@@ -54,33 +48,33 @@
|
||||
- 22
|
||||
- 222
|
||||
ssh_server_match_address:
|
||||
- address: '192.168.1.0/24'
|
||||
- address: 192.168.1.0/24
|
||||
rules:
|
||||
- 'AllowTcpForwarding yes'
|
||||
- 'AllowAgentForwarding no'
|
||||
- AllowTcpForwarding yes
|
||||
- AllowAgentForwarding no
|
||||
ssh_server_match_group:
|
||||
- group: 'root'
|
||||
- group: root
|
||||
rules:
|
||||
- 'AllowTcpForwarding yes'
|
||||
- 'AllowAgentForwarding no'
|
||||
- AllowTcpForwarding yes
|
||||
- AllowAgentForwarding no
|
||||
ssh_server_match_user:
|
||||
- user: 'root'
|
||||
- user: root
|
||||
rules:
|
||||
- 'AllowTcpForwarding yes'
|
||||
- 'AllowAgentForwarding no'
|
||||
- AllowTcpForwarding yes
|
||||
- AllowAgentForwarding no
|
||||
ssh_server_match_local_port:
|
||||
- port: 222
|
||||
rules:
|
||||
- 'AllowTcpForwarding yes'
|
||||
- 'AllowAgentForwarding no'
|
||||
- AllowTcpForwarding yes
|
||||
- AllowAgentForwarding no
|
||||
ssh_remote_hosts:
|
||||
- names: ['example.com', 'example2.com']
|
||||
options: ['Port 2222', 'ForwardAgent yes']
|
||||
- names: ['example3.com']
|
||||
options: ['StrictHostKeyChecking no']
|
||||
- names: [example.com, example2.com]
|
||||
options: [Port 2222, ForwardAgent yes]
|
||||
- names: [example3.com]
|
||||
options: [StrictHostKeyChecking no]
|
||||
ssh_use_dns: true
|
||||
ssh_use_pam: true
|
||||
ssh_max_startups: '10:30:60'
|
||||
ssh_max_startups: 10:30:60
|
||||
ssh_host_key_algorithms:
|
||||
- ssh-ed25519
|
||||
- rsa-sha2-512
|
||||
@@ -98,6 +92,6 @@
|
||||
- diffie-hellman-group-exchange-sha256
|
||||
- diffie-hellman-group-exchange-sha1
|
||||
ssh_custom_options:
|
||||
- "Include /etc/ssh/ssh_config.d/*"
|
||||
- Include /etc/ssh/ssh_config.d/*
|
||||
sshd_custom_options:
|
||||
- "AcceptEnv LANG"
|
||||
- AcceptEnv LANG
|
||||
@@ -3,7 +3,7 @@ driver:
|
||||
name: docker
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
|
||||
image: rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
- name: Wrapper playbook for kitchen testing "ansible-ssh-hardening" with default settings
|
||||
hosts: all
|
||||
become: true
|
||||
environment:
|
||||
@@ -7,13 +7,13 @@
|
||||
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
|
||||
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
|
||||
tasks:
|
||||
- name: use python3
|
||||
set_fact:
|
||||
- name: Use python3
|
||||
ansible.builtin.set_fact:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
when: ansible_facts.distribution == 'Fedora'
|
||||
|
||||
- name: install packages # noqa ignore-errors
|
||||
yum:
|
||||
- name: Install packages # noqa ignore-errors
|
||||
ansible.builtin.yum:
|
||||
name:
|
||||
- openssh-clients
|
||||
- openssh-server
|
||||
@@ -22,8 +22,8 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: install packages # noqa ignore-errors
|
||||
dnf:
|
||||
- name: Install packages # noqa ignore-errors
|
||||
ansible.builtin.dnf:
|
||||
name:
|
||||
- openssh-clients
|
||||
- openssh-server
|
||||
@@ -32,8 +32,8 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: install packages # noqa ignore-errors
|
||||
apt:
|
||||
- name: Install packages # noqa ignore-errors
|
||||
ansible.builtin.apt:
|
||||
name:
|
||||
- openssh-client
|
||||
- openssh-server
|
||||
@@ -41,19 +41,20 @@
|
||||
update_cache: true
|
||||
ignore_errors: true
|
||||
|
||||
- name: install required tools on SuSE
|
||||
- name: Install required tools on SuSE
|
||||
# cannot use zypper module, since it depends on python-xml
|
||||
shell: "zypper -n install python-xml"
|
||||
ansible.builtin.command: zypper -n install python-xml
|
||||
changed_when: false
|
||||
when: ansible_facts.os_family == 'Suse'
|
||||
|
||||
- name: install packages
|
||||
zypper:
|
||||
- name: Install packages
|
||||
community.general.zypper:
|
||||
name:
|
||||
- "openssh"
|
||||
- openssh
|
||||
when: ansible_facts.os_family == 'Suse'
|
||||
|
||||
- name: install required tools on Arch
|
||||
pacman:
|
||||
- name: Install required tools on Arch
|
||||
community.general.pacman:
|
||||
name:
|
||||
- openssh
|
||||
- awk
|
||||
@@ -61,16 +62,17 @@
|
||||
update_cache: true
|
||||
when: ansible_facts.os_family == 'Archlinux'
|
||||
|
||||
- name: created needed directory
|
||||
file:
|
||||
path: "/var/run/sshd"
|
||||
- name: Created needed directory
|
||||
ansible.builtin.file:
|
||||
path: /var/run/sshd
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: create ssh host keys # noqa ignore-errors
|
||||
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"
|
||||
- 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
-1
@@ -1,7 +1,7 @@
|
||||
molecule
|
||||
molecule-plugins[docker]
|
||||
yamllint
|
||||
ansible
|
||||
ansible-core==2.16.5
|
||||
ansible-lint
|
||||
docker
|
||||
flake8
|
||||
|
||||
+111
-54
@@ -1,6 +1,6 @@
|
||||
# devsec.mysql_hardening
|
||||
|
||||

|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/mysql_hardening.yml)
|
||||
|
||||
## Description
|
||||
|
||||
@@ -12,74 +12,131 @@ It configures:
|
||||
- Removes anonymous users, users without a password or authentication_string and test databases
|
||||
- various hardening options inside MySQL
|
||||
|
||||
Changes of options `log_error` or `datadir` in `mysql_hardening_options` will not be checked for correct permissions. Please change/set `log_error` or `datadir` with the installation role of MySQL before running this role, or you can run this role twice.
|
||||
|
||||
Further information is available at [Deutsche Telekom (German)](http://www.telekom.com/static/-/155996/7/technische-sicherheitsanforderungen-si) and [Symantec](http://www.symantec.com/connect/articles/securing-mysql-step-step)
|
||||
|
||||
## Requirements
|
||||
|
||||
- Ansible 2.9.0
|
||||
- An existing MySQL installation
|
||||
- An existing installation of MySQL or MariaDB.
|
||||
- python-jmespath on the ansible host
|
||||
|
||||
### Example playbook
|
||||
<!-- BEGIN_ANSIBLE_DOCS -->
|
||||
|
||||
```yml
|
||||
- hosts: localhost
|
||||
collections:
|
||||
- devsec.hardening
|
||||
roles:
|
||||
- mysql_hardening
|
||||
```
|
||||
## Supported Operating Systems
|
||||
|
||||
This role expects an existing installation of MySQL or MariaDB. Changes of options `log_error` or `datadir` in `mysql_hardening_options` will not be checked for correct permissions. Please change/set `log_error` or `datadir` with the installation role of MySQL before running this role, or you can run this role twice.
|
||||
Please ensure that the following variables are set accordingly:
|
||||
|
||||
- `mysql_hardening_enabled: yes` role is enabled by default and can be disabled without removing it from a playbook. You can use conditional variable, for example: `mysql_hardening_enabled: "{{ true if mysql_enabled else false }}"`
|
||||
- `mysql_hardening_user: 'mysql'` The user that mysql runs as.
|
||||
- `mysql_hardening_mysql_hardening_conf_file: '/etc/mysql/conf.d/hardening.cnf'` The path to the configuration file where the hardening will be performed
|
||||
- _deprecated: `mysql_datadir: '/var/lib/mysql'` The MySQL data directory_
|
||||
- `mysql_datadir` is no longer necessary, as MySQL data directory is automatically taken from `mysql_info`. But it can still be defined and will also be checked for correct permissions.
|
||||
- EL
|
||||
- 7, 8, 9
|
||||
- Ubuntu
|
||||
- bionic, focal, jammy
|
||||
- Debian
|
||||
- bullseye, buster
|
||||
- Amazon
|
||||
- opensuse
|
||||
|
||||
## Role Variables
|
||||
|
||||
- `mysql_daemon_enabled`
|
||||
- Default: `true`
|
||||
- Description: Whether to enable the MySQL-service so it starts on boot
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `mysql_hardening_chroot`
|
||||
- Default: ""
|
||||
- Default: ``
|
||||
- Description: [chroot](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_chroot)
|
||||
- `mysql_hardening_options.safe-user-create`
|
||||
- Default: 1
|
||||
- Description: [safe-user-create](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_safe-user-create)
|
||||
- `mysql_hardening_options.secure-auth`
|
||||
- Default: 1
|
||||
- Description: [secure-auth](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_secure-auth)
|
||||
- `mysql_hardening_options.skip-symbolic-links`
|
||||
- Default: 1
|
||||
- Description: [skip-symbolic-links](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_symbolic-links)
|
||||
- `mysql_hardening_skip_grant_tables:`
|
||||
- Default: false
|
||||
- Description: [skip-grant-tables](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-grant-tables)
|
||||
- `mysql_hardening_skip_show_database`
|
||||
- Default: 1
|
||||
- Description: [skip-show-database](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-show-database)
|
||||
- `mysql_hardening_options.local-infile`
|
||||
- Default: 0
|
||||
- Description: [local-infile](http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_local_infile)
|
||||
- `mysql_hardening_options.allow-suspicious-udfs`
|
||||
- Default: 0
|
||||
- Description: [allow-suspicious-udfs](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_allow-suspicious-udfs)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `mysql_hardening_chroot.automatic-sp-privileges`
|
||||
- Default: 0
|
||||
- Default: `0`
|
||||
- Description: [automatic_sp_privileges](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_automatic_sp_privileges)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `mysql_hardening_enabled`
|
||||
- Default: `true`
|
||||
- Description: Whether to run the hardening
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `mysql_hardening_options.allow-suspicious-udfs`
|
||||
- Default: `0`
|
||||
- Description: [allow-suspicious-udfs](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_allow-suspicious-udfs)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `mysql_hardening_options.local-infile`
|
||||
- Default: `0`
|
||||
- Description: [local-infile](http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_local_infile)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `mysql_hardening_options.safe-user-create`
|
||||
- Default: `1`
|
||||
- Description: [safe-user-create](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_safe-user-create)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `mysql_hardening_options.secure-auth`
|
||||
- Default: `1`
|
||||
- Description: [secure-auth](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_secure-auth)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `mysql_hardening_options.secure-file-priv`
|
||||
- Default: /tmp
|
||||
- Default: `/tmp`
|
||||
- Description: [secure-file-priv](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_secure-file-priv)
|
||||
- `mysql_allow_remote_root`
|
||||
- Default: false
|
||||
- Description: delete remote root users
|
||||
- `mysql_remove_anonymous_users`
|
||||
- Default: true
|
||||
- Description: remove users without authentication
|
||||
- `mysql_remove_test_database`
|
||||
- Default: true
|
||||
- Description: remove test database
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `mysql_hardening_options.skip-symbolic-links`
|
||||
- Default: `1`
|
||||
- Description: [skip-symbolic-links](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_symbolic-links)
|
||||
- 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`
|
||||
- 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
|
||||
- `mysql_hardening_skip_show_database`
|
||||
- Default: `1`
|
||||
- Description: [skip-show-database](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-show-database)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `mysql_remove_anonymous_users`
|
||||
- Default: `true`
|
||||
- Description: Set to `false` to keep users without authentication
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `mysql_remove_remote_root`
|
||||
- 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`
|
||||
- Description: Set to `false` to keep the test database
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `mysql_root_password`
|
||||
- Default: `-----====>SetR00tPa$$wordH3r3!!!<====-----`
|
||||
- Description: The default password. Please change or overwrite it
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `mysql_user_home`
|
||||
- Default: `{{ ansible_env.HOME }}`
|
||||
- Description: The path where the `.my.cnf` will be stored
|
||||
- Type: str
|
||||
- Required: no
|
||||
|
||||
Further information is available at [Deutsche Telekom (German)](http://www.telekom.com/static/-/155996/7/technische-sicherheitsanforderungen-si) and [Symantec](http://www.symantec.com/connect/articles/securing-mysql-step-step)
|
||||
## Dependencies
|
||||
|
||||
None.
|
||||
|
||||
## Example Playbook
|
||||
|
||||
```
|
||||
- hosts: all
|
||||
roles:
|
||||
- name: devsec.hardening.mysql_hardening
|
||||
```
|
||||
|
||||
<!-- END_ANSIBLE_DOCS -->
|
||||
@@ -6,8 +6,6 @@ mysql_daemon_enabled: true
|
||||
|
||||
mysql_hardening_restart_mysql: true
|
||||
|
||||
# general configuration
|
||||
mysql_hardening_mysql_hardening_conf_file: "{{ mysql_hardening_mysql_confd_dir }}/hardening.cnf"
|
||||
# You have to change this to your own strong enough mysql root password
|
||||
mysql_root_password: "-----====>SetR00tPa$$wordH3r3!!!<====-----"
|
||||
# There .my.cnf with mysql root credentials will be installed
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
argument_specs:
|
||||
main:
|
||||
short_description: The main entry point for the mysql hardening role.
|
||||
version_added: 8.8.0
|
||||
options:
|
||||
mysql_hardening_chroot:
|
||||
default: ''
|
||||
type: str
|
||||
description: '[chroot](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_chroot)'
|
||||
mysql_hardening_options.safe-user-create:
|
||||
default: 1
|
||||
type: int
|
||||
description: '[safe-user-create](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_safe-user-create)'
|
||||
mysql_hardening_options.secure-auth:
|
||||
default: 1
|
||||
type: int
|
||||
description: '[secure-auth](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_secure-auth)'
|
||||
mysql_hardening_options.skip-symbolic-links:
|
||||
default: 1
|
||||
type: int
|
||||
description: '[skip-symbolic-links](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_symbolic-links)'
|
||||
'mysql_hardening_skip_grant_tables:':
|
||||
default: false
|
||||
type: bool
|
||||
description: '[skip-grant-tables](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-grant-tables)'
|
||||
mysql_hardening_skip_show_database:
|
||||
default: 1
|
||||
type: int
|
||||
description: '[skip-show-database](http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-show-database)'
|
||||
mysql_hardening_options.local-infile:
|
||||
default: 0
|
||||
type: int
|
||||
description: '[local-infile](http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_local_infile)'
|
||||
mysql_hardening_options.allow-suspicious-udfs:
|
||||
default: 0
|
||||
type: int
|
||||
description: '[allow-suspicious-udfs](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_allow-suspicious-udfs)'
|
||||
mysql_hardening_chroot.automatic-sp-privileges:
|
||||
default: 0
|
||||
type: int
|
||||
description: '[automatic_sp_privileges](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_automatic_sp_privileges)'
|
||||
mysql_hardening_options.secure-file-priv:
|
||||
default: /tmp
|
||||
type: str
|
||||
description: '[secure-file-priv](https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_secure-file-priv)'
|
||||
mysql_remove_anonymous_users:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to keep users without authentication
|
||||
mysql_remove_test_database:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to keep the test database
|
||||
mysql_hardening_restart_mysql:
|
||||
default: true
|
||||
type: bool
|
||||
description: Restart mysql after running this role
|
||||
mysql_hardening_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Whether to run the hardening
|
||||
mysql_daemon_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Whether to enable the MySQL-service so it starts on boot
|
||||
mysql_root_password:
|
||||
default: '-----====>SetR00tPa$$wordH3r3!!!<====-----'
|
||||
type: str
|
||||
description: The default password. Please change or overwrite it
|
||||
mysql_user_home:
|
||||
default: '{{ ansible_env.HOME }}'
|
||||
type: str
|
||||
description: The path where the `.my.cnf` will be stored
|
||||
mysql_remove_remote_root:
|
||||
default: true
|
||||
type: bool
|
||||
description: If `true`, root can only connect from localhost. Set to `false`
|
||||
to not remove remote root users.
|
||||
@@ -56,7 +56,7 @@
|
||||
- name: Apply hardening configuration
|
||||
ansible.builtin.template:
|
||||
src: hardening.cnf.j2
|
||||
dest: "{{ mysql_hardening_mysql_hardening_conf_file }}"
|
||||
dest: "{{ mysql_hardening_mysql_confd_dir + '/hardening.cnf' }}"
|
||||
owner: "{{ mysql_cnf_owner }}"
|
||||
group: "{{ mysql_cnf_group }}"
|
||||
mode: "0640"
|
||||
|
||||
@@ -46,6 +46,16 @@
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
when: mysql_remove_remote_root
|
||||
|
||||
- name: Detect role support on MySQL version >= 5.7.6 or Mariadb version >= 10.4.0
|
||||
community.mysql.mysql_query:
|
||||
query: >
|
||||
SELECT 1 FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'
|
||||
AND COLUMN_NAME = 'is_role';
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
register: mysql_role_support
|
||||
check_mode: false
|
||||
|
||||
- name: Get all users that have no authentication_string on MySQL version >= 5.7.6 or Mariadb version >= 10.4.0
|
||||
community.mysql.mysql_query:
|
||||
query: >
|
||||
@@ -55,7 +65,8 @@
|
||||
OR authentication_string="")
|
||||
AND USER NOT IN ('mysql.sys',
|
||||
'mysqlxsys',
|
||||
'mariadb.sys');
|
||||
'mariadb.sys')
|
||||
{{ 'AND CONVERT(is_role USING utf8) = "N"' if mysql_role_support.rowcount[0] > 0 }};
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
register: mysql_users_wo_passwords_or_auth_string
|
||||
check_mode: false
|
||||
@@ -75,7 +86,8 @@
|
||||
OR authentication_string="")
|
||||
AND USER NOT IN ('mysql.sys',
|
||||
'mysqlxsys',
|
||||
'mariadb.sys');
|
||||
'mariadb.sys')
|
||||
{{ 'AND is_role = "N"' if mysql_role_support.rowcount[0] > 0 }};
|
||||
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
|
||||
register: mysql_users_wo_passwords
|
||||
check_mode: false
|
||||
|
||||
+121
-89
@@ -1,6 +1,6 @@
|
||||
# devsec.nginx_hardening
|
||||
|
||||

|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/nginx_hardening.yml)
|
||||
|
||||
## Description
|
||||
|
||||
@@ -8,110 +8,142 @@ This role provides secure nginx configuration. It is intended to be compliant wi
|
||||
|
||||
It works with the following nginx-roles, including, but not limited to:
|
||||
|
||||
- [geerlingguy.nginx](https://galaxy.ansible.com/geerlingguy/nginx/)
|
||||
- [nginxinc.nginx](https://galaxy.ansible.com/nginxinc/nginx)
|
||||
- [jdauphant.nginx](https://galaxy.ansible.com/jdauphant/nginx/)
|
||||
- [franklinkim.nginx](https://galaxy.ansible.com/franklinkim/nginx/)
|
||||
- [nginxinc.nginx](https://galaxy.ansible.com/ui/standalone/roles/nginxinc/nginx/)
|
||||
- [geerlinggux.nginx](https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/nginx/)
|
||||
- [jdauphant.nginx](https://galaxy.ansible.com/ui/standalone/roles/jdauphant/nginx/)
|
||||
|
||||
**NOTE: This role does not work with nginx 1.0.15 or older! Please use the latest version from the official nginx repositories!**
|
||||
|
||||
## Requirements
|
||||
<!-- BEGIN_ANSIBLE_DOCS -->
|
||||
|
||||
- Ansible >= 2.9
|
||||
## Supported Operating Systems
|
||||
|
||||
- EL
|
||||
- 7, 8, 9
|
||||
- Ubuntu
|
||||
- bionic, focal, jammy
|
||||
- Debian
|
||||
- buster, bullseye
|
||||
- Amazon
|
||||
|
||||
## Role Variables
|
||||
|
||||
- [nginx_client_body_buffer_size][]
|
||||
- `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'\\\""]`
|
||||
- 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
|
||||
- Required: no
|
||||
- `nginx_client_body_buffer_size`
|
||||
- Default: `1k`
|
||||
- Description: Sets buffer size for reading client request body. In case the request body is larger than the buffer, the whole body or only its part is written to a temporary file.
|
||||
- nginx_remove_default_site
|
||||
- Description: Sets buffer size for reading client request body. In case the request body is larger than the buffer, the whole body or only its part is written to a temporary file. See [nginx_client_body_buffer_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_client_body_timeout`
|
||||
- Default: `10`
|
||||
- Description: Defines a timeout for reading client request body. See [nginx_client_body_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `nginx_client_header_buffer_size`
|
||||
- Default: `1k`
|
||||
- Description: Sets buffer size for reading client request header. For most requests, a buffer of 1K bytes is enough. See [nginx_client_header_buffer_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_client_header_timeout`
|
||||
- Default: `10`
|
||||
- Description: Defines a timeout for reading client request header. See [nginx_client_header_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `nginx_client_max_body_size`
|
||||
- Default: `1k`
|
||||
- Description: Sets the maximum allowed size of the client request body, specified in the "Content-Length" request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. See [nginx_client_max_body_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_configuration_dir`
|
||||
- Default: `/etc/nginx`
|
||||
- Description: The main location for all nginx configuration files
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_configuration_hardening_dir`
|
||||
- Default: `/etc/nginx`
|
||||
- Description: The location for the nginx hardening configuration file (Could be different e.g. when used in jails)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_dh_size`
|
||||
- Default: `2048`
|
||||
- Description: Specifies the length of DH parameters for EDH ciphers. See [nginx_dh_size](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `nginx_keepalive_timeout`
|
||||
- Default: `5 5`
|
||||
- Description: The first parameter sets a timeout during which a keep-alive client connection will stay open on the server side. The zero value disables keep-alive client connections. The optional second parameter sets a value in the "Keep-Alive timeout=time" response header field. See [nginx_keepalive_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_large_client_header_buffers`
|
||||
- Default: `2 1k`
|
||||
- Description: Sets the maximum number and size of buffers used for reading large client request header. See [nginx_large_client_header_buffers](http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_limit_conn`
|
||||
- Default: `default 5`
|
||||
- Description: Sets the shared memory zone and the maximum allowed number of connections for a given key value. See [nginx_limit_conn](http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_limit_conn_zone`
|
||||
- Default: `$binary_remote_addr zone=default:10m`
|
||||
- Description: Sets parameters for a shared memory zone that will keep states for various keys. See [nginx_limit_conn_zone](http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_owner_group`
|
||||
- Default: `root`
|
||||
- Description: The owner group of the nginx configuration files
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_owner_user`
|
||||
- Default: `root`
|
||||
- Description: The owner user of the nginx configuration files
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_remove_default_site`
|
||||
- Default: `true`
|
||||
- Description: Disables the default site. Set to false to enable the default site in nginx.
|
||||
- [nginx_client_max_body_size][]
|
||||
- Default: `1k`
|
||||
- Description: Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 41
|
||||
3 (Request Entity Too Large) error is returned to the client.
|
||||
- [nginx_keepalive_timeout][]
|
||||
- Default: `5 5`
|
||||
- Description: The first parameter sets a timeout during which a keep-alive client connection will stay open on the server side. The zero value disables keep-alive client connections. The op
|
||||
tional second parameter sets a value in the “Keep-Alive: timeout=time” response header field.
|
||||
- [nginx_server_tokens][]
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `nginx_send_timeout`
|
||||
- Default: `10`
|
||||
- Description: Sets a timeout for transmitting a response to the client. See [nginx_send_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout)
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `nginx_server_tokens`
|
||||
- Default: `off`
|
||||
- Description: Disables emitting nginx version in error messages and in the "Server" response header field. Set to on to enable the nginx version in error messages and "Server" response head
|
||||
er.
|
||||
- [nginx_client_header_buffer_size][]
|
||||
- Default: `1k`
|
||||
- Description: Sets buffer size for reading client request header. For most requests, a buffer of 1K bytes is enough.
|
||||
- [nginx_large_client_header_buffers][]
|
||||
- Default: `2 1k`
|
||||
- Description: Sets the maximum number and size of buffers used for reading large client request header.
|
||||
- [nginx_client_body_timeout][]
|
||||
- Default: `10`
|
||||
- Description: Defines a timeout for reading client request body.
|
||||
- [nginx_client_header_timeout][]
|
||||
- Default: `10`
|
||||
- Description: Defines a timeout for reading client request header.
|
||||
- [nginx_send_timeout][]
|
||||
- Default: `10`
|
||||
- Description: Sets a timeout for transmitting a response to the client.
|
||||
- [nginx_limit_conn_zone][]
|
||||
- Default: `$binary_remote_addr zone=default:10m`
|
||||
- Description: Sets parameters for a shared memory zone that will keep states for various keys.
|
||||
- [nginx_limit_conn][]
|
||||
- Default: `default 5`
|
||||
- Description: Sets the shared memory zone and the maximum allowed number of connections for a given key value.
|
||||
- [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'\" ]`
|
||||
- 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.
|
||||
- [nginx_ssl_protocols][]
|
||||
- Default: `TLSv1.2`
|
||||
- Description: Specifies the SSL protocol which should be used.
|
||||
- [nginx_ssl_ciphers][]
|
||||
- Default: _see defaults.yml_
|
||||
- Description: Specifies the TLS ciphers which should be used.
|
||||
- [nginx_ssl_prefer_server_ciphers][]
|
||||
- Description: Disables emitting nginx version in error messages and in the "Server" response header field. Set to on to enable the nginx version in error messages and "Server" response header. See [nginx_server_tokens](http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_ssl_ciphers`
|
||||
- Default: `ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256`
|
||||
- Description: Specifies the TLS ciphers which should be used. See [nginx_ssl_ciphers](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_ssl_prefer_server_ciphers`
|
||||
- Default: `on`
|
||||
- Description: Specifies that server ciphers should be preferred over client ciphers when using the TLS protocols. Set to false to disable it.
|
||||
- [nginx_dh_size][]
|
||||
- Default: `2048`
|
||||
- Description: Specifies the length of DH parameters for EDH ciphers.
|
||||
- [nginx_configuration_dir][]
|
||||
- default: "/etc/nginx"
|
||||
- Description: The main location for all nginx configuration files
|
||||
- [nginx_configuration_hardening_dir][]
|
||||
- default: "/etc/nginx"
|
||||
- Description: The location for the nginx hardening configuration file (Could be different e.g. when used in jails)
|
||||
- [nginx_owner_user][]
|
||||
- default: "root"
|
||||
- Description: The owner user of the nginx configuration files
|
||||
- [nginx_owner_group][]
|
||||
- default: "root"
|
||||
- Description: The owner group of the nginx configuration files
|
||||
- Description: Specifies that server ciphers should be preferred over client ciphers when using the TLS protocols. Set to false to disable it. See [nginx_ssl_prefer_server_ciphers](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers)
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `nginx_ssl_protocols`
|
||||
- Default: `TLSv1.2`
|
||||
- Description: Specifies the SSL protocol which should be used. See [nginx_ssl_protocols](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols)
|
||||
- Type: str
|
||||
- Required: no
|
||||
|
||||
## Dependencies
|
||||
|
||||
None.
|
||||
|
||||
## Example Playbook
|
||||
|
||||
```
|
||||
- hosts: localhost
|
||||
collections:
|
||||
- devsec.hardening
|
||||
- hosts: all
|
||||
roles:
|
||||
- nginx_hardening
|
||||
- name: devsec.hardening.nginx_hardening
|
||||
```
|
||||
|
||||
[nginx_client_body_buffer_size]: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size
|
||||
[nginx_client_max_body_size]: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
|
||||
[nginx_keepalive_timeout]: http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
|
||||
[nginx_server_tokens]: http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens
|
||||
[nginx_more_clear_headers]: http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
|
||||
[nginx_client_header_buffer_size]: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size
|
||||
[nginx_large_client_header_buffers]: http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers
|
||||
[nginx_client_body_timeout]: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
|
||||
[nginx_client_header_timeout]: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout
|
||||
[nginx_send_timeout]: http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout
|
||||
[nginx_limit_conn_zone]: http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone
|
||||
[nginx_limit_conn]: http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn
|
||||
[nginx_add_header]: http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
|
||||
[nginx_ssl_protocols]: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
|
||||
[nginx_ssl_ciphers]: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers
|
||||
[nginx_ssl_prefer_server_ciphers]: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers
|
||||
[nginx_dh_size]: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam
|
||||
<!-- END_ANSIBLE_DOCS -->
|
||||
@@ -25,7 +25,6 @@ nginx_add_header:
|
||||
- Strict-Transport-Security max-age=15768000
|
||||
- Content-Security-Policy "script-src 'self'; object-src 'self'"
|
||||
|
||||
nginx_set_cookie_flag: "* HttpOnly secure"
|
||||
nginx_ssl_prefer_server_ciphers: "on"
|
||||
nginx_ssl_protocols: TLSv1.2 TLSv1.3
|
||||
# yamllint disable-line rule:line-length
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
---
|
||||
argument_specs:
|
||||
main:
|
||||
short_description: The main entry point for the nginx hardening role.
|
||||
version_added: 8.8.0
|
||||
options:
|
||||
nginx_client_body_buffer_size:
|
||||
default: 1k
|
||||
type: str
|
||||
description: Sets buffer size for reading client request body. In case the
|
||||
request body is larger than the buffer, the whole body or only its part
|
||||
is written to a temporary file. See [nginx_client_body_buffer_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size)
|
||||
nginx_remove_default_site:
|
||||
default: true
|
||||
type: bool
|
||||
description: Disables the default site. Set to false to enable the default
|
||||
site in nginx.
|
||||
nginx_client_max_body_size:
|
||||
default: 1k
|
||||
type: str
|
||||
description: Sets the maximum allowed size of the client request body, specified
|
||||
in the "Content-Length" request header field. If the size in a request exceeds
|
||||
the configured value, the 413 (Request Entity Too Large) error is returned
|
||||
to the client. See [nginx_client_max_body_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size)
|
||||
nginx_keepalive_timeout:
|
||||
default: 5 5
|
||||
type: str
|
||||
description: The first parameter sets a timeout during which a keep-alive
|
||||
client connection will stay open on the server side. The zero value disables
|
||||
keep-alive client connections. The optional second parameter sets a value
|
||||
in the "Keep-Alive timeout=time" response header field. See [nginx_keepalive_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout) # noqa yaml[line-length]
|
||||
nginx_server_tokens:
|
||||
default: 'off'
|
||||
type: str
|
||||
description: Disables emitting nginx version in error messages and in the
|
||||
"Server" response header field. Set to on to enable the nginx version in
|
||||
error messages and "Server" response header. See [nginx_server_tokens](http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens)
|
||||
nginx_client_header_buffer_size:
|
||||
default: 1k
|
||||
type: str
|
||||
description: Sets buffer size for reading client request header. For most
|
||||
requests, a buffer of 1K bytes is enough. See [nginx_client_header_buffer_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client
|
||||
nginx_large_client_header_buffers:
|
||||
default: 2 1k
|
||||
type: str
|
||||
description: Sets the maximum number and size of buffers used for reading
|
||||
large client request header. See [nginx_large_client_header_buffers](http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers) # noqa yaml[line-length]
|
||||
nginx_client_body_timeout:
|
||||
default: 10
|
||||
type: int
|
||||
description: Defines a timeout for reading client request body. See [nginx_client_body_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout) # noqa yaml[line-length]
|
||||
nginx_client_header_timeout:
|
||||
default: 10
|
||||
type: int
|
||||
description: Defines a timeout for reading client request header. See [nginx_client_header_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout) # noqa yaml[line-length]
|
||||
nginx_send_timeout:
|
||||
default: 10
|
||||
type: int
|
||||
description: Sets a timeout for transmitting a response to the client. See
|
||||
[nginx_send_timeout](http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout)
|
||||
nginx_limit_conn_zone:
|
||||
default: $binary_remote_addr zone=default:10m
|
||||
type: str
|
||||
description: Sets parameters for a shared memory zone that will keep states
|
||||
for various keys. See [nginx_limit_conn_zone](http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone)
|
||||
nginx_limit_conn:
|
||||
default: default 5
|
||||
type: str
|
||||
description: Sets the shared memory zone and the maximum allowed number of
|
||||
connections for a given key value. See [nginx_limit_conn](http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn)
|
||||
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'\"]
|
||||
type: list
|
||||
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)
|
||||
nginx_ssl_protocols:
|
||||
default: TLSv1.2
|
||||
type: str
|
||||
description: Specifies the SSL protocol which should be used. See [nginx_ssl_protocols](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols) # noqa yaml[line-length]
|
||||
nginx_ssl_ciphers:
|
||||
default: ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 # noqa yaml[line-length]
|
||||
type: str
|
||||
description: Specifies the TLS ciphers which should be used. See [nginx_ssl_ciphers](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers)
|
||||
nginx_ssl_prefer_server_ciphers:
|
||||
default: 'on'
|
||||
type: str
|
||||
description: Specifies that server ciphers should be preferred over client
|
||||
ciphers when using the TLS protocols. Set to false to disable it. See [nginx_ssl_prefer_server_ciphers](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers) # noqa yaml[line-length]
|
||||
nginx_dh_size:
|
||||
default: 2048
|
||||
type: int
|
||||
description: Specifies the length of DH parameters for EDH ciphers. See [nginx_dh_size](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam) # noqa yaml[line-length]
|
||||
nginx_configuration_dir:
|
||||
default: /etc/nginx
|
||||
type: str
|
||||
description: The main location for all nginx configuration files
|
||||
nginx_configuration_hardening_dir:
|
||||
default: /etc/nginx
|
||||
type: str
|
||||
description: The location for the nginx hardening configuration file (Could
|
||||
be different e.g. when used in jails)
|
||||
nginx_owner_user:
|
||||
default: root
|
||||
type: str
|
||||
description: The owner user of the nginx configuration files
|
||||
nginx_owner_group:
|
||||
default: root
|
||||
type: str
|
||||
description: The owner group of the nginx configuration files
|
||||
+901
-523
File diff suppressed because it is too large.
Load diff
@@ -1,5 +1,6 @@
|
||||
---
|
||||
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
|
||||
os_auth_pw_min_age: 7 # Discourage password cycling
|
||||
@@ -306,7 +307,7 @@ sysctl_config:
|
||||
|
||||
# Do not delete the following line or otherwise the playbook will fail
|
||||
# at task 'create a combined sysctl-dict if overwrites are defined'
|
||||
sysctl_overwrite:
|
||||
sysctl_overwrite: {}
|
||||
# Disable unused filesystems
|
||||
os_unused_filesystems:
|
||||
- cramfs
|
||||
@@ -332,9 +333,13 @@ os_hardening_enabled: true
|
||||
|
||||
# Set to false to disable installing and configuring auditd.
|
||||
os_auditd_enabled: true
|
||||
os_auditd_template: etc/audit/auditd.conf.j2
|
||||
os_auditd_flush: INCREMENTAL
|
||||
os_auditd_freq: 20
|
||||
os_auditd_max_log_file: 6
|
||||
os_auditd_max_log_file_action: keep_logs
|
||||
os_auditd_write_logs: true
|
||||
os_auditd_log_file: /var/log/audit/audit.log
|
||||
os_auditd_log_format: RAW
|
||||
os_auditd_admin_space_left: 50
|
||||
os_auditd_space_left: 75
|
||||
@@ -352,7 +357,7 @@ os_selinux_state: enforcing
|
||||
os_selinux_policy: targeted
|
||||
|
||||
# Mount options for proc in /etc/fstab.
|
||||
proc_mnt_options: rw,nosuid,nodev,noexec,relatime,hidepid={{ hidepid_option }}
|
||||
proc_mnt_options: rw,nosuid,nodev,noexec,relatime
|
||||
|
||||
# Set to false to disable installing and configuring cron.
|
||||
os_cron_enabled: true
|
||||
|
||||
@@ -2,15 +2,26 @@
|
||||
- name: Update-initramfs # noqa no-changed-when
|
||||
ansible.builtin.command: update-initramfs -u
|
||||
|
||||
- name: Restart auditd # noqa command-instead-of-module no-changed-when
|
||||
ansible.builtin.command:
|
||||
cmd: service auditd restart # rhel: see: https://access.redhat.com/solutions/2664811
|
||||
when: molecule_yml.driver.name | default() != "docker" # restarting auditd in a container does not work
|
||||
|
||||
- name: Reload systemd
|
||||
ansible.builtin.systemd:
|
||||
daemon_reload: true
|
||||
|
||||
- name: Restart auditd via systemd
|
||||
ansible.builtin.systemd:
|
||||
name: auditd.service
|
||||
state: restarted
|
||||
ignore_errors: "{{ ansible_check_mode }}"
|
||||
when:
|
||||
- molecule_yml.driver.name | default() != "docker" # restarting auditd in a container does not work
|
||||
- not ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Restart auditd via service # noqa command-instead-of-module no-changed-when
|
||||
ansible.builtin.command:
|
||||
cmd: service auditd restart # rhel: see: https://access.redhat.com/solutions/2664811
|
||||
when:
|
||||
- molecule_yml.driver.name | default() != "docker" # restarting auditd in a container does not work
|
||||
- ansible_facts.os_family == 'RedHat'
|
||||
|
||||
- name: Remount filesystems
|
||||
ansible.posix.mount:
|
||||
path: "{{ item }}"
|
||||
|
||||
@@ -0,0 +1,847 @@
|
||||
---
|
||||
argument_specs:
|
||||
main:
|
||||
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
|
||||
description: Specify paths that should be checked for binaries where access will be minimized
|
||||
os_env_extra_user_paths:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: Specify additional paths that should be checked for binaries where access will be minimized
|
||||
os_auth_pw_max_age:
|
||||
default: 60
|
||||
type: int
|
||||
description: maximum password age (set to `99999` to effectively disable it).
|
||||
os_auth_pw_min_age:
|
||||
default: 7
|
||||
type: int
|
||||
description: minimum password age (before allowing any other password change).
|
||||
os_auth_pw_warn_age:
|
||||
default: 7
|
||||
type: int
|
||||
description: number of days of warning before password expires.
|
||||
os_auth_pw_remember:
|
||||
default: 5
|
||||
type: int
|
||||
description: how many used passwords are record.
|
||||
os_auth_retries:
|
||||
default: 5
|
||||
type: int
|
||||
description: the maximum number of authentication attempts, before the account
|
||||
is locked for some time.
|
||||
os_auth_lockout_time:
|
||||
default: 600
|
||||
type: int
|
||||
description: time in seconds that needs to pass, if the account was locked
|
||||
due to too many failed authentication attempts.
|
||||
os_auth_timeout:
|
||||
default: 60
|
||||
type: int
|
||||
description: authentication timeout in seconds, so login will exit if this
|
||||
time passes.
|
||||
os_auth_allow_homeless:
|
||||
default: false
|
||||
type: bool
|
||||
description: true if to allow users without home to login.
|
||||
os_auth_pam_passwdqc_enable:
|
||||
default: true
|
||||
type: bool
|
||||
description: true if you want to use strong password checking in PAM using
|
||||
passwdqc.
|
||||
os_auth_pam_passwdqc_options:
|
||||
default: min=disabled,disabled,16,12,8
|
||||
type: str
|
||||
description: set to any option line (as a string) that you want to pass to
|
||||
passwdqc.
|
||||
os_auth_pam_oddjob_mkhomedir:
|
||||
default: false
|
||||
type: bool
|
||||
description: Enables automatic homedir e.g. in FreeIPA environments
|
||||
os_auth_pam_pwquality_options:
|
||||
default: try_first_pass retry=3 authtok_type=
|
||||
type: str
|
||||
description: Options to pass to the PAM module pwquality
|
||||
os_security_users_allow:
|
||||
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
|
||||
description: kernel is crashing or otherwise misbehaving and a kernel core
|
||||
dump is created.
|
||||
os_security_suid_sgid_enforce:
|
||||
default: true
|
||||
type: bool
|
||||
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.
|
||||
os_security_suid_sgid_blacklist:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: a list of paths which should have their SUID/SGID bits removed.
|
||||
os_security_suid_sgid_whitelist:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: a list of paths which should not have their SUID/SGID bits altered.
|
||||
os_security_suid_sgid_remove_from_unknown:
|
||||
default: false
|
||||
type: bool
|
||||
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`.
|
||||
os_auth_uid_min:
|
||||
default: 1000
|
||||
type: int
|
||||
description: minimum number for automatic uid selection in useradd.
|
||||
os_auth_uid_max:
|
||||
default: 60000
|
||||
type: int
|
||||
description: maximum number for automatic uid selection in useradd.
|
||||
os_auth_gid_min:
|
||||
default: 1000
|
||||
type: int
|
||||
description: minimum number for automatic gid selection in groupadd.
|
||||
os_auth_gid_max:
|
||||
default: 60000
|
||||
type: int
|
||||
description: maximum number for automatic gid selection in groupadd.
|
||||
os_auth_sub_uid_count:
|
||||
default: 65536
|
||||
type: int
|
||||
description: If /etc/subuid exists, the commands useradd and newusers (unless
|
||||
the user already have subordinate user IDs) allocate SUB_UID_COUNT unused
|
||||
user IDs from the range SUB_UID_MIN to SUB_UID_MAX for each new user. See
|
||||
also `os_auth_sub_uid_min` and `os_auth_sub_uid_max`.
|
||||
os_auth_sub_uid_min:
|
||||
default: 100000
|
||||
type: int
|
||||
description: minimum number for automatic subordinate uid selection in useradd
|
||||
and newusers.
|
||||
os_auth_sub_uid_max:
|
||||
default: 600100000
|
||||
type: int
|
||||
description: maximum number for automatic subordinate uid selection in useradd
|
||||
and newusers.
|
||||
os_auth_sub_gid_count:
|
||||
default: 65536
|
||||
type: int
|
||||
description: If /etc/subuid exists, the commands useradd and newusers (unless
|
||||
the user already have subordinate group IDs) allocate SUB_GID_COUNT unused
|
||||
group IDs from the range SUB_GID_MIN to SUB_GID_MAX for each new user. See
|
||||
also `os_auth_sub_gid_min` and `os_auth_sub_gid_max`.
|
||||
os_auth_sub_gid_min:
|
||||
default: 100000
|
||||
type: int
|
||||
description: minimum number for automatic subordinate gid selection in useradd
|
||||
and newusers.
|
||||
os_auth_sub_gid_max:
|
||||
default: 600100000
|
||||
type: int
|
||||
description: maximum number for automatic subordinate gid selection in useradd
|
||||
and newusers.
|
||||
os_security_packages_clean:
|
||||
default: true
|
||||
type: bool
|
||||
description: removes packages with known issues. See section packages.
|
||||
os_selinux_state:
|
||||
default: enforcing
|
||||
type: str
|
||||
description: Set the SELinux state, can be either disabled, permissive, or
|
||||
enforcing.
|
||||
os_selinux_policy:
|
||||
default: targeted
|
||||
type: str
|
||||
description: Set the SELinux polixy.
|
||||
ufw_manage_defaults:
|
||||
default: true
|
||||
type: bool
|
||||
description: true means apply all settings with `ufw_` prefix.
|
||||
ufw_ipt_sysctl:
|
||||
default: "''"
|
||||
type: str
|
||||
description: by default it disables IPT_SYSCTL in /etc/default/ufw. If you
|
||||
want to overwrite /etc/sysctl.conf values using ufw - set it to your sysctl
|
||||
dictionary, for example `/etc/ufw/sysctl.conf`.
|
||||
ufw_default_input_policy:
|
||||
default: DROP
|
||||
type: str
|
||||
description: set default input policy of ufw to `DROP`.
|
||||
ufw_default_output_policy:
|
||||
default: ACCEPT
|
||||
type: str
|
||||
description: set default output policy of ufw to `ACCEPT`.
|
||||
ufw_default_forward_policy:
|
||||
default: DROP
|
||||
type: str
|
||||
description: set default forward policy of ufw to `DROP`.
|
||||
ufw_enable_ipv6:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `true` to apply rules to support IPv6 (no means only IPv6
|
||||
on loopback accepted).
|
||||
os_auditd_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring auditd.
|
||||
os_auditd_log_format:
|
||||
default: RAW
|
||||
type: str
|
||||
description: Describes how the information should be stored on disk. There
|
||||
are 2 options - raw and enriched.
|
||||
os_auditd_max_log_file_action:
|
||||
default: keep_logs
|
||||
type: str
|
||||
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`.
|
||||
os_auditd_max_log_file:
|
||||
default: 6
|
||||
type: int
|
||||
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_num_logs:
|
||||
default: 5
|
||||
type: int
|
||||
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.
|
||||
os_auditd_flush:
|
||||
default: INCREMENTAL
|
||||
type: str
|
||||
description: Valid values are none, incremental, incremental_async, data,
|
||||
and sync.
|
||||
os_auditd_admin_space_left:
|
||||
default: 50
|
||||
type: int
|
||||
description: This is a numeric value in megabytes that tells the audit daemon
|
||||
when to perform a configurable action because the system is running low
|
||||
on disk space.
|
||||
os_auditd_admin_space_left_action:
|
||||
default: SUSPEND
|
||||
type: str
|
||||
description: This parameter tells the system what action to take when the
|
||||
system has detected that it is low on disk space. Valid values are ignore,
|
||||
syslog, rotate, email, exec, suspend, single, and halt.
|
||||
os_auditd_space_left:
|
||||
default: 75
|
||||
type: int
|
||||
description: If the free space in the filesystem containing log_file drops
|
||||
below this value, the audit daemon takes the action specified by space_left_action.
|
||||
os_auditd_space_left_action:
|
||||
default: SYSLOG
|
||||
type: str
|
||||
description: This parameter tells the system what action to take when the
|
||||
system has detected that it is starting to get low on disk space. Valid
|
||||
values are ignore, syslog, rotate, email, exec, suspend, single, and halt.
|
||||
os_auditd_action_mail_acct:
|
||||
default: root
|
||||
type: str
|
||||
description: If `space_left_action` or `admin_space_left_action` are set to
|
||||
`email`, uses the address or alias to send the email using `/usr/lib/sendmail`.
|
||||
of events created on one system but reported/analyzed on another system.
|
||||
os_auditd_disk_error_action:
|
||||
default: SUSPEND
|
||||
type: str
|
||||
description: This parameter tells the system what action to take whenever
|
||||
there is an error detected when writing audit events to disk or rotating
|
||||
logs. Valid values are ignore, syslog, exec, suspend, single, and halt.
|
||||
os_auditd_disk_full_action:
|
||||
default: SUSPEND
|
||||
type: str
|
||||
description: This parameter tells the system what action to take when the
|
||||
system has detected that the partition to which log files are written has
|
||||
become full. Valid values are ignore, syslog, rotate, exec, suspend, single,
|
||||
and halt.
|
||||
os_auditd_log_group:
|
||||
default: root
|
||||
type: str
|
||||
description: specifies the group that is applied to the log file's permissions.
|
||||
The group name can be either numeric or spelled out.
|
||||
proc_mnt_options:
|
||||
default: rw,nosuid,nodev,noexec,relatime
|
||||
type: str
|
||||
description: Mount proc with hardenized options. Note that the hidepid option
|
||||
is set separately in vars/.
|
||||
os_ignore_users:
|
||||
default: [vagrant, kitchen]
|
||||
type: list
|
||||
description: Specify system accounts whose login should not be disabled and
|
||||
password not changed
|
||||
os_chmod_home_folders:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to disable "chmod 700" of home folders for regular
|
||||
users
|
||||
os_ignore_home_folder_users:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: Specify user accounts, whose home folders shouldn't be chmodded
|
||||
to 700 when "os_chmod_home_folders" is enabled.
|
||||
os_chmod_rootuser_home_folder:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to disable "chmod 700" of root's home folder
|
||||
os_rootuser_pw_ageing:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to enforce password age settings for root user(s)
|
||||
os_remove_additional_root_users:
|
||||
default: false
|
||||
type: bool
|
||||
description: When enabled and there are multiple users with UID=0, only "root"
|
||||
will be kept. Others will be deleted.
|
||||
os_user_pw_ageing:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable password age enforcement on existing
|
||||
users
|
||||
os_users_without_password_ageing:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: List of users, where password ageing should not be enforced even
|
||||
if "os_user_pw_ageing" is enabled
|
||||
os_cron_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring cron.
|
||||
os_ctrlaltdel_disabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to disable ctrl-alt-delete key combination.
|
||||
os_limits_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring limits.
|
||||
os_login_defs_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring login_defs
|
||||
for newly created users.
|
||||
os_minimize_access_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring minimize_access.
|
||||
os_pam_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring pam.
|
||||
os_modprobe_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring modprobe.
|
||||
os_profile_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring profile.
|
||||
os_security_auto_logout:
|
||||
default: 0
|
||||
type: int
|
||||
description: Set timeout in seconds for logout users automatically after time.
|
||||
Setting this to `0` disables the timeout.
|
||||
os_securetty_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring securetty.
|
||||
os_sysctl_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring sysctl.
|
||||
os_user_accounts_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring user_accounts.
|
||||
os_rhosts_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring rhosts.
|
||||
os_yum_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring yum.
|
||||
os_yum_repo_file_whitelist:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: List of yum repository files under /etc/yum.repos.d/ which should
|
||||
not be altered.
|
||||
os_apt_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring apt.
|
||||
os_selinux_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to disable installing and configuring selinux.
|
||||
os_sha_crypt_min_rounds:
|
||||
default: 640000
|
||||
type: int
|
||||
description: Define the number of minimum SHA rounds. With a lot of rounds
|
||||
brute forcing the password is more difficult. But note also that it more
|
||||
CPU resources will be needed to authenticate users. The values must be inside
|
||||
the 1000-999999999 range.
|
||||
os_sha_crypt_max_rounds:
|
||||
default: 640000
|
||||
type: int
|
||||
description: Define the number of maximum SHA rounds. With a lot of rounds
|
||||
brute forcing the password is more difficult. But note also that it more
|
||||
CPU resources will be needed to authenticate users. The values must be inside
|
||||
the 1000-999999999 range.
|
||||
os_mnt_boot_dir_mode:
|
||||
default: '0700'
|
||||
type: str
|
||||
description: Set default perimissions for /boot
|
||||
os_mnt_boot_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /boot mountpoint
|
||||
os_mnt_boot_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /boot
|
||||
os_mnt_boot_options:
|
||||
default: rw,nosuid,nodev,noexec
|
||||
description: Configure mount options for /boot
|
||||
os_mnt_boot_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /boot. If empty, the current
|
||||
file system type will be used.
|
||||
os_mnt_boot_dump:
|
||||
default: ext3 + ext4 = 1 / other = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_boot_passno:
|
||||
default: ext3 + ext4 = 2 / other = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_dev_dir_mode:
|
||||
default: '0755'
|
||||
type: str
|
||||
description: Set default perimissions for /dev
|
||||
os_mnt_dev_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to ignore /dev mountpoint
|
||||
os_mnt_dev_src:
|
||||
default: devtmpfs
|
||||
type: str
|
||||
description: Set mount source for /dev
|
||||
os_mnt_dev_options:
|
||||
default: rw,nosuid,noexec
|
||||
type: str
|
||||
description: Configure mount options for /dev
|
||||
os_mnt_dev_filesystem:
|
||||
default: devtmpfs
|
||||
type: str
|
||||
description: Configure file system for fstab entry /dev
|
||||
os_mnt_dev_dump:
|
||||
default: '0'
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp.
|
||||
os_mnt_dev_passno:
|
||||
default: '0'
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp.
|
||||
os_mnt_dev_shm_dir_mode:
|
||||
default: '1777'
|
||||
type: str
|
||||
description: Set default perimissions for /dev/shm
|
||||
os_mnt_dev_shm_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to ignore /dev/shm mountpoint
|
||||
os_mnt_dev_shm_src:
|
||||
default: tmpfs
|
||||
type: str
|
||||
description: Set mount source for /dev/shm
|
||||
os_mnt_dev_shm_options:
|
||||
default: rw,nosuid,nodev,noexec
|
||||
type: str
|
||||
description: Configure mount options for /dev/shm
|
||||
os_mnt_dev_shm_filesystem:
|
||||
default: tmpfs
|
||||
type: str
|
||||
description: Configure file system for fstab entry /dev/shm
|
||||
os_mnt_dev_shm_dump:
|
||||
default: '0'
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp.
|
||||
os_mnt_dev_shm_passno:
|
||||
default: '0'
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp.
|
||||
os_mnt_home_dir_mode:
|
||||
default: '0755'
|
||||
type: str
|
||||
description: Set default perimissions for /home
|
||||
os_mnt_home_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /home mountpoint
|
||||
os_mnt_home_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /home. If empty, the current file system
|
||||
source device will be used.
|
||||
os_mnt_home_options:
|
||||
default: rw,nosuid,nodev
|
||||
type: str
|
||||
description: Configure mount options for /home
|
||||
os_mnt_home_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /home. If empty, the current
|
||||
file system type will be used.
|
||||
os_mnt_home_dump:
|
||||
default: ext3/4 = 1, others = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_home_passno:
|
||||
default: ext3/4 = 2, others = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_run_dir_mode:
|
||||
default: '0755'
|
||||
type: str
|
||||
description: Set default perimissions for /run
|
||||
os_mnt_run_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to false to ignore /run mountpoint
|
||||
os_mnt_run_src:
|
||||
default: tmpfs
|
||||
type: str
|
||||
description: Set mount source for /run
|
||||
os_mnt_run_options:
|
||||
default: rw,nosuid,nodev
|
||||
type: str
|
||||
description: Configure mount options for /run
|
||||
os_mnt_run_filesystem:
|
||||
default: tmpfs
|
||||
type: str
|
||||
description: Configure file system for fstab entry /run
|
||||
os_mnt_run_dump:
|
||||
default: '0'
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp.
|
||||
os_mnt_run_passno:
|
||||
default: '0'
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp.
|
||||
os_mnt_tmp_dir_mode:
|
||||
default: '1777'
|
||||
type: str
|
||||
description: Set default perimissions for /tmp
|
||||
os_mnt_tmp_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /tmp mountpoint
|
||||
os_mnt_tmp_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /tmp. If empty, the current file system
|
||||
source device will be used.
|
||||
os_mnt_tmp_options:
|
||||
default: rw,nosuid,nodev,noexec
|
||||
type: str
|
||||
description: Configure mount options for /tmp
|
||||
os_mnt_tmp_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /tmp. If empty, the current
|
||||
file system type will be used.
|
||||
os_mnt_tmp_dump:
|
||||
default: ext3/4 = 1, others = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_tmp_passno:
|
||||
default: ext3/4 = 2, others = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_dir_mode:
|
||||
default: '0755'
|
||||
type: str
|
||||
description: Set default perimissions for /var
|
||||
os_mnt_var_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /var mountpoint
|
||||
os_mnt_var_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /var. If empty, the current file system
|
||||
source device will be used.
|
||||
os_mnt_var_options:
|
||||
default: rw,nosuid,nodev
|
||||
type: str
|
||||
description: Configure mount options for /var
|
||||
os_mnt_var_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /var. If empty, the current
|
||||
file system type will be used.
|
||||
os_mnt_var_dump:
|
||||
default: ext3/4 = 1, others = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_passno:
|
||||
default: ext3/4 = 2, others = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_log_dir_mode:
|
||||
default: '0755'
|
||||
type: str
|
||||
description: Set default perimissions for /var/log
|
||||
os_mnt_var_log_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /var/log mountpoint
|
||||
os_mnt_var_log_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /var/log. If empty, the current file system
|
||||
source device will be used.
|
||||
os_mnt_var_log_options:
|
||||
default: rw,nosuid,nodev,noexec
|
||||
type: str
|
||||
description: Configure mount options for /var/log
|
||||
os_mnt_var_log_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /var/log. If empty, the
|
||||
current file system type will be used.
|
||||
os_mnt_var_log_dump:
|
||||
default: ext3/4 = 1, others = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_log_passno:
|
||||
default: ext3/4 = 2, others = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_log_audit_dir_mode:
|
||||
default: '0640'
|
||||
type: str
|
||||
description: Set default perimissions for /var/log/audit
|
||||
os_mnt_var_log_audit_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /var/log/audit mountpoint
|
||||
os_mnt_var_log_audit_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /var/log/audit. If empty, the current file
|
||||
system source device will be used.
|
||||
os_mnt_var_log_audit_options:
|
||||
default: rw,nosuid,nodev,noexec
|
||||
type: str
|
||||
description: Configure mount options for /var/log/audit
|
||||
os_mnt_var_log_audit_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /var/log/audit. If empty,
|
||||
the current file system type will be used.
|
||||
os_mnt_var_log_audit_dump:
|
||||
default: ext3/4 = 1, others = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_log_audit_passno:
|
||||
default: ext3/4 = 2, others = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_tmp_dir_mode:
|
||||
default: '1777'
|
||||
type: str
|
||||
description: Set default perimissions for /var/tmp
|
||||
os_mnt_var_tmp_enabled:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to true to configure /var/tmp mountpoint
|
||||
os_mnt_var_tmp_src:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Set mount source for /var/tmp. If empty, the current file system
|
||||
source device will be used.
|
||||
os_mnt_var_tmp_options:
|
||||
default: rw,nosuid,nodev,noexec
|
||||
type: str
|
||||
description: Configure mount options for /var/tmp
|
||||
os_mnt_var_tmp_filesystem:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Configure file system for fstab entry /var/tmp. If empty, the
|
||||
current file system type will be used.
|
||||
os_mnt_var_tmp_dump:
|
||||
default: ext3/4 = 1, others = 0
|
||||
type: str
|
||||
description: Configure dump for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_mnt_var_tmp_passno:
|
||||
default: ext3/4 = 2, others = 0
|
||||
type: str
|
||||
description: Configure passno for fstab entry /var/tmp. If empty, the default
|
||||
depends on fstype.
|
||||
os_netrc_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Configure filesystem for existence of .netrc file in homedir
|
||||
os_netrc_whitelist_user:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: Add list of user to allow creation of .netrc in users homedir
|
||||
sysctl_overwrite:
|
||||
default: '{}'
|
||||
type: dict
|
||||
description: To overwrite options in the `sysctl_config`-dict, overwrite them
|
||||
here.
|
||||
sysctl_config:
|
||||
type: dict
|
||||
description: various sysctl-settings
|
||||
default:
|
||||
fs.protected_hardlinks: 1
|
||||
fs.protected_symlinks: 1
|
||||
fs.protected_fifos: 1
|
||||
fs.protected_regular: 2
|
||||
fs.suid_dumpable: 0
|
||||
kernel.core_uses_pid: 1
|
||||
kernel.kptr_restrict: 2
|
||||
kernel.kexec_load_disabled: 1
|
||||
kernel.sysrq: 0
|
||||
kernel.randomize_va_space: 2
|
||||
kernel.yama.ptrace_scope: 1
|
||||
net.ipv4.ip_forward: 0
|
||||
net.ipv6.conf.all.forwarding: 0
|
||||
net.ipv4.conf.all.rp_filter: 1
|
||||
net.ipv4.conf.default.rp_filter: 1
|
||||
net.ipv4.icmp_echo_ignore_broadcasts: 1
|
||||
net.ipv4.icmp_ignore_bogus_error_responses: 1
|
||||
net.ipv4.icmp_ratelimit: 100
|
||||
net.ipv4.icmp_ratemask: 88089
|
||||
net.ipv4.tcp_timestamps: 0
|
||||
net.ipv4.conf.all.arp_ignore: 1
|
||||
net.ipv4.conf.all.arp_announce: 2
|
||||
net.ipv4.tcp_rfc1337: 1
|
||||
net.ipv4.tcp_syncookies: 1
|
||||
net.ipv4.conf.all.shared_media: 1
|
||||
net.ipv4.conf.default.shared_media: 1
|
||||
net.ipv4.conf.all.accept_source_route: 0
|
||||
net.ipv4.conf.default.accept_source_route: 0
|
||||
net.ipv6.conf.all.accept_source_route: 0
|
||||
net.ipv6.conf.default.accept_source_route: 0
|
||||
net.ipv4.conf.all.send_redirects: 0
|
||||
net.ipv4.conf.default.send_redirects: 0
|
||||
net.ipv4.conf.all.log_martians: 1
|
||||
net.ipv4.conf.default.log_martians: 1
|
||||
net.ipv4.conf.default.accept_redirects: 0
|
||||
net.ipv4.conf.all.accept_redirects: 0
|
||||
net.ipv4.conf.all.secure_redirects: 0
|
||||
net.ipv4.conf.default.secure_redirects: 0
|
||||
net.ipv6.conf.default.accept_redirects: 0
|
||||
net.ipv6.conf.all.accept_redirects: 0
|
||||
net.ipv6.conf.all.accept_ra: 0
|
||||
net.ipv6.conf.default.accept_ra: 0
|
||||
net.ipv6.conf.default.router_solicitations: 0
|
||||
net.ipv6.conf.all.router_solicitations: 0
|
||||
net.ipv6.conf.default.accept_ra_rtr_pref: 0
|
||||
net.ipv6.conf.default.accept_ra_pinfo: 0
|
||||
net.ipv6.conf.default.accept_ra_defrtr: 0
|
||||
net.ipv6.conf.default.autoconf: 0
|
||||
net.ipv6.conf.all.autoconf: 0
|
||||
net.ipv6.conf.default.dad_transmits: 0
|
||||
net.ipv6.conf.default.max_addresses: 1
|
||||
vm.mmap_min_addr: 65536
|
||||
vm.mmap_rnd_bits: 32
|
||||
vm.mmap_rnd_compat_bits: 16
|
||||
os_unused_filesystems:
|
||||
default:
|
||||
- cramfs
|
||||
- freevxfs
|
||||
- jffs2
|
||||
- hfs
|
||||
- hfsplus
|
||||
- squashfs
|
||||
- udf
|
||||
- vfat
|
||||
- dccp
|
||||
- rds
|
||||
- sctp
|
||||
- tipc
|
||||
type: list
|
||||
description: Disable this list of unused filesystems
|
||||
os_filesystem_whitelist:
|
||||
default: '[]'
|
||||
type: list
|
||||
description: A list of filesystems that should not be disabled
|
||||
os_hardening_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Whether to run the hardening
|
||||
os_auth_root_ttys:
|
||||
default: [console, tty1, tty2, tty3, tty4, tty5, tty6]
|
||||
type: list
|
||||
description: A list of TTYs, from which root can log in, see `man securetty`
|
||||
for reference
|
||||
os_chfn_restrict:
|
||||
default: "''"
|
||||
type: str
|
||||
description: Indicate which fields are changeable by chfn.
|
||||
os_security_init_prompt:
|
||||
default: true
|
||||
type: bool
|
||||
description: The PROMPT option provides console users the ability to interactively
|
||||
boot the system and select which services to start on boot.
|
||||
os_security_init_single:
|
||||
default: false
|
||||
type: bool
|
||||
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
|
||||
os_security_packages_list:
|
||||
default: [xinetd, inetd, ypserv, telnet-server, rsh-server, prelink]
|
||||
type: list
|
||||
description: List of deprecated or insecure packages to remove
|
||||
ufw_default_application_policy:
|
||||
default: SKIP
|
||||
type: str
|
||||
description: The default application policy is skip, which means that the
|
||||
update --add-new command will do nothing
|
||||
ufw_ipt_modules:
|
||||
default: nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns
|
||||
type: str
|
||||
description: Define which netfilter modules to load
|
||||
ufw_manage_builtins:
|
||||
default: 'no'
|
||||
type: str
|
||||
description: If this variable is set to 'yes', on stop and reload the built-in
|
||||
chains are flushed. If it is set to 'no', on stop and reload the ufw secondary
|
||||
chains are removed and the ufw primary chains are flushed
|
||||
@@ -7,10 +7,12 @@
|
||||
|
||||
- name: Configure auditd | package-08
|
||||
ansible.builtin.template:
|
||||
src: etc/audit/auditd.conf.j2
|
||||
src: "{{ os_auditd_template }}"
|
||||
dest: /etc/audit/auditd.conf
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0640"
|
||||
notify: Restart auditd
|
||||
notify:
|
||||
- Restart auditd via service
|
||||
- Restart auditd via systemd
|
||||
tags: auditd
|
||||
@@ -1,4 +1,10 @@
|
||||
---
|
||||
- name: Gather facts, if not present
|
||||
ansible.builtin.setup:
|
||||
when: not ansible_facts
|
||||
tags:
|
||||
- always
|
||||
|
||||
- name: Fetch OS dependent variables
|
||||
ansible.builtin.include_vars:
|
||||
file: "{{ item }}"
|
||||
|
||||
@@ -7,12 +7,7 @@
|
||||
- name: Find files with write-permissions for group # noqa command-instead-of-shell
|
||||
ansible.builtin.shell: find -L {{ item }} -perm /go+w -type f
|
||||
with_community.general.flattened:
|
||||
- /usr/local/sbin
|
||||
- /usr/local/bin
|
||||
- /usr/sbin
|
||||
- /usr/bin
|
||||
- /sbin
|
||||
- /bin
|
||||
- "{{ os_env_user_paths }}"
|
||||
- "{{ os_env_extra_user_paths }}"
|
||||
register: minimize_access_directories
|
||||
ignore_errors: true
|
||||
@@ -73,12 +68,23 @@
|
||||
mode: "0750"
|
||||
when: '"change_user" not in os_security_users_allow'
|
||||
|
||||
# we have to define this combined variable here, because when defining it
|
||||
# in the defaults like this:
|
||||
# proc_mnt_options: rw,nosuid,nodev,noexec,relatime,hidepid={{ hidepid_option }}
|
||||
# the role argument validator complains about the missing hidepid_option-variable.
|
||||
# If we define the hidepid_option-variable in the defaults, we cannot
|
||||
# overwrite it anymore in the vars (for some reason).
|
||||
|
||||
- name: Define proc_mnt_options including hidepid_option
|
||||
ansible.builtin.set_fact:
|
||||
_proc_mnt_options: "{{ proc_mnt_options }},hidepid={{ hidepid_option }}"
|
||||
|
||||
- name: Set option hidepid for proc filesystem
|
||||
ansible.posix.mount:
|
||||
path: /proc
|
||||
src: proc
|
||||
fstype: proc
|
||||
opts: "{{ proc_mnt_options }}"
|
||||
opts: "{{ _proc_mnt_options }}"
|
||||
state: mounted
|
||||
|
||||
- name: Generate list of current available mounted filesystems on the system
|
||||
@@ -87,7 +93,7 @@
|
||||
|
||||
- name: Append special devices list to valid mountpoint list
|
||||
ansible.builtin.set_fact:
|
||||
mountpoints_list: "{{ mountpoints_list + ['/dev', '/dev/shm', '/run'] }}"
|
||||
mountpoints_list: "{{ mountpoints_list + ['/dev', '/dev/shm', '/run', '/tmp'] }}"
|
||||
|
||||
- name: Minimize access for filesystems
|
||||
ansible.builtin.include_tasks: minimize_access_fs.yml
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
{{ ansible_managed | comment }}
|
||||
# Generated by Ansible role {{ ansible_role_name }}
|
||||
|
||||
log_file = /var/log/audit/audit.log
|
||||
write_logs = {{ os_auditd_write_logs | bool | ternary('yes', 'no') }}
|
||||
log_file = {{ os_auditd_log_file }}
|
||||
log_format = {{ os_auditd_log_format }}
|
||||
log_group = {{ os_auditd_log_group }}
|
||||
priority_boost = 4
|
||||
flush = {{ os_auditd_flush }}
|
||||
freq = 20
|
||||
freq = {{ os_auditd_freq }}
|
||||
num_logs = {{ os_auditd_num_logs }}
|
||||
disp_qos = lossy
|
||||
dispatcher = /sbin/audispd
|
||||
|
||||
@@ -189,7 +189,7 @@ SHA_CRYPT_MAX_ROUNDS {{ os_sha_crypt_max_rounds }}
|
||||
|
||||
# Obsoleted by PAM
|
||||
# ================
|
||||
# These options are now handled by PAM. Please edit the appropriate file in `/etc/pam.d/` to enable the equivelants of them.
|
||||
# These options are now handled by PAM. Please edit the appropriate file in `/etc/pam.d/` to enable their equivalents.
|
||||
#MOTD_FILE
|
||||
#DIALUPS_CHECK_ENAB
|
||||
#LASTLOG_ENAB
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{{ ansible_managed | comment }}
|
||||
# Generated by Ansible role {{ ansible_role_name }}
|
||||
|
||||
{% for fs in os_unused_filesystems | difference(os_filesystem_whitelist) %}
|
||||
{% for fs in os_unused_filesystems | difference(os_filesystem_whitelist) | sort %}
|
||||
install {{fs}} /bin/true
|
||||
{% endfor %}
|
||||
+445
-249
@@ -1,6 +1,8 @@
|
||||
# dev-sec.ssh_hardening
|
||||
|
||||

|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_bsd.yml)
|
||||
[](https://github.com/dev-sec/ansible-collection-hardening/actions/workflows/ssh_hardening_custom_tests.yml)
|
||||
|
||||
## Description
|
||||
|
||||
@@ -8,251 +10,6 @@ This role provides secure ssh-client and ssh-server configurations. It is intend
|
||||
|
||||
Warning: This role disables root-login on the target server! Please make sure you have another user with su or sudo permissions that can login into the server.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Ansible >= 2.9
|
||||
- root-privileges on the target system
|
||||
|
||||
As this role requires root-privileges, we added `become: true` to all tasks. So please make sure you run the role as root or as a user with become-privileges.
|
||||
|
||||
## Role Variables
|
||||
|
||||
- `network_ipv6_enable`
|
||||
- Default: `true`
|
||||
- Description: false if IPv6 is not needed. `ssh_listen_to` must also be set to listen to IPv6 addresses (for example `[::]`).
|
||||
- `ssh_client_config_file`
|
||||
- Default: `'/etc/ssh/ssh_config'`
|
||||
- Description: path of the ssh client configuration file, e.g. `/etc/ssh/ssh_config.d/custom.conf`.
|
||||
- `ssh_server_config_file`
|
||||
- Default: `'/etc/ssh/sshd_config'`
|
||||
- Description: path of the ssh server configuration file, e.g. `/etc/ssh/sshd_config.d/custom.conf`.
|
||||
- `ssh_server_ports`
|
||||
- Default: `['22']`
|
||||
- Description: ports on which ssh-server should listen.
|
||||
- `ssh_client_port`
|
||||
- Default: `'22'`
|
||||
- Description: Specifies the port number to connect on the remote host.
|
||||
- `ssh_listen_to`
|
||||
- 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!
|
||||
- `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.
|
||||
- `ssh_host_rsa_key_size`
|
||||
- Default: `4096`
|
||||
- Description: Specifies the number of bits in the private host RSA key to create.
|
||||
- `ssh_host_key_algorithms`
|
||||
- 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!
|
||||
- `ssh_client_host_key_algorithms`
|
||||
- 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!.
|
||||
- `ssh_client_alive_interval`
|
||||
- Default: `600`
|
||||
- Description: specifies an interval for sending keepalive messages.
|
||||
- `ssh_client_alive_count`
|
||||
- Default: `3`
|
||||
- Description: Defines the number of acceptable unanswered client alive messages before disconnecting clients.
|
||||
- `ssh_permit_tunnel`
|
||||
- Default: `false`
|
||||
- Description: true if SSH Port Tunneling is required.
|
||||
- `ssh_remote_hosts`
|
||||
- Default: `[]`
|
||||
- Description: one or more hosts and their custom options for the ssh-client. Default is empty. See examples in `defaults/main.yml`.
|
||||
- `ssh_permit_root_login`
|
||||
- Default: `no`
|
||||
- Description: Disable root-login. Set to `'without-password'` or `'yes'` to enable root-login - The quotes are required!
|
||||
- `ssh_allow_tcp_forwarding`
|
||||
- Default: `no`
|
||||
- Description: `'no'` or `False` to disable TCP Forwarding. Set to `'yes'` or `True` to allow TCP Forwarding. If you are using OpenSSH >= 6.2 version, you can specify `'yes'`, `'no'`, `'all'`, `'local'`or`'remote'`.
|
||||
- `ssh_gateway_ports`
|
||||
- Default: `false`
|
||||
- Description: `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.
|
||||
- `ssh_allow_agent_forwarding`
|
||||
- Default: `false`
|
||||
- Description: false to disable Agent Forwarding. Set to true to allow Agent Forwarding.
|
||||
- `ssh_x11_forwarding`
|
||||
- Default: `false`
|
||||
- Description: false to disable X11 Forwarding. Set to true to allow X11 Forwarding.
|
||||
- `ssh_pam_support`
|
||||
- Default: `true`
|
||||
- Description: true if SSH has PAM support.
|
||||
- `ssh_use_pam`
|
||||
- Default: `true`
|
||||
- Description: false to disable pam authentication.
|
||||
- `ssh_gssapi_support`
|
||||
- Default: `false`
|
||||
- Description: Set to true to enable GSSAPI authentication (both client and server).
|
||||
- `ssh_gssapi_delegation`
|
||||
- Default: `false`
|
||||
- Description: Set to true to enable GSSAPI credential forwarding.
|
||||
- `ssh_kerberos_support`
|
||||
- Default: `true`
|
||||
- Description: true if SSH has Kerberos support.
|
||||
- `ssh_deny_users`
|
||||
- Default: `''`
|
||||
- Description: if specified, login is disallowed for user names that match one of the patterns.
|
||||
- `ssh_allow_users`
|
||||
- Default: `''`
|
||||
- Description: if specified, login is allowed only for user names that match one of the patterns.
|
||||
- `ssh_deny_groups`
|
||||
- Default: `''`
|
||||
- Description: if specified, login is disallowed for users whose primary group or supplementary group list matches one of the patterns.
|
||||
- `ssh_allow_groups`
|
||||
- Default: `''`
|
||||
- Description: if specified, login is allowed only for users whose primary group or supplementary group list matches one of the patterns.
|
||||
- `ssh_authorized_keys_file`
|
||||
- Default: `''`
|
||||
- Description: change default file that contains the public keys that can be used for user authentication.
|
||||
- `ssh_trusted_user_ca_keys_file`
|
||||
- Default: `''`
|
||||
- Description: specifies the file containing trusted certificate authorities public keys used to sign user certificates.
|
||||
- `ssh_trusted_user_ca_keys`
|
||||
- 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.
|
||||
- `ssh_authorized_principals_file`
|
||||
- Default: `''`
|
||||
- Description: specifies the file containing principals that are allowed. Only used if `ssh_trusted_user_ca_keys_file` is set.
|
||||
- `ssh_authorized_principals`
|
||||
- Default: `[]`
|
||||
- Description: list of hashes containing file paths and authorized principals, see `default_custom.yml` for all options. Only used if `ssh_authorized_principals_file` is set.
|
||||
- `ssh_print_motd`
|
||||
- Default: `false`
|
||||
- Description: false to disable printing of the MOTD.
|
||||
- `ssh_print_pam_motd`
|
||||
- Default: `false`
|
||||
- Description: false to disable printing of the MOTD via pam (Debian and Ubuntu).
|
||||
- `ssh_print_last_log`
|
||||
- Default: `false`
|
||||
- Description: false to disable display of last login information.
|
||||
- `sftp_enabled`
|
||||
- Default: `true`
|
||||
- Description: false to disable sftp configuration.
|
||||
- `sftp_umask`
|
||||
- Default: `'0027'`
|
||||
- Description: Specifies the umask for sftp.
|
||||
- `sftp_chroot`
|
||||
- Default: `true`
|
||||
- Description: false to disable chroot for sftp.
|
||||
- `sftp_chroot_dir`
|
||||
- Default: `/home/%u`
|
||||
- Description: change default sftp chroot location.
|
||||
- `ssh_client_roaming`
|
||||
- Default: `false`
|
||||
- Description: enable experimental client roaming.
|
||||
- `sshd_moduli_file`
|
||||
- Default: `'/etc/ssh/moduli'`
|
||||
- Description: path to the SSH moduli file.
|
||||
- `sshd_moduli_minimum`
|
||||
- Default: `2048`
|
||||
- Description: remove Diffie-Hellman parameters smaller than the defined size to mitigate logjam.
|
||||
- `ssh_challengeresponseauthentication`
|
||||
- Default: `false`
|
||||
- Description: Specifies whether challenge-response authentication is allowed (e.g. via PAM).
|
||||
- `ssh_client_password_login`
|
||||
- Default: `false`
|
||||
- Description: `true` to allow password-based authentication with the ssh client.
|
||||
- `ssh_server_password_login`
|
||||
- Default: `false`
|
||||
- Description: `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`.
|
||||
- `ssh_banner`
|
||||
- Default: `false`
|
||||
- Description: `true` to print a banner on login.
|
||||
- `ssh_banner_path`
|
||||
- Default: `'/etc/sshd/banner.txt'`
|
||||
- Description: path to the SSH banner file.
|
||||
- `ssh_client_hardening`
|
||||
- Default: `true`
|
||||
- Description: `false` to stop harden the client.
|
||||
- `ssh_client_compression`
|
||||
- Default: `false`
|
||||
- Description: Specifies whether the client requests compression.
|
||||
- `ssh_compression`
|
||||
- Default: `false`
|
||||
- Description: Specifies whether server-side compression is enabled after the user has authenticated successfully.
|
||||
- `ssh_login_grace_time`
|
||||
- Default: `30s`
|
||||
- Description: specifies the time allowed for successful authentication to the SSH server.
|
||||
- `ssh_max_auth_retries`
|
||||
- Default: `2`
|
||||
- Description: Specifies the maximum number of authentication attempts permitted per connection.
|
||||
- `ssh_max_sessions`
|
||||
- Default: `10`
|
||||
- Description: Specifies the maximum number of open sessions permitted from a given connection.
|
||||
- `ssh_print_debian_banner`
|
||||
- Default: `false`
|
||||
- Description: `true` to print debian specific banner.
|
||||
- `ssh_server_enabled`
|
||||
- Default: `true`
|
||||
- Description: `false` to disable the opensshd server.
|
||||
- `ssh_server_hardening`
|
||||
- Default: `true`
|
||||
- Description: `false` to stop harden the server.
|
||||
- `ssh_server_match_address`
|
||||
- Default: `''`
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- `ssh_server_match_group`
|
||||
- Default: `''`
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- `ssh_server_match_user`
|
||||
- Default: `''`
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- `ssh_server_match_local_port`
|
||||
- Default: `''`
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- `ssh_server_permit_environment_vars`
|
||||
- Default: `no`
|
||||
- Description: `yes` to specify that ~/.ssh/environment and environment= options in ~/.ssh/authorized_keys are processed by sshd. With openssh version 7.8 it is possible to specify a whitelist of environment variable names in addition to global "yes" or "no" settings.
|
||||
- `ssh_server_accept_env_vars`
|
||||
- Default: `''`
|
||||
- Description: Specifies what environment variables sent by the client will be copied into the session's environment, multiple environment variables may be separated by whitespace.
|
||||
- `ssh_use_dns`
|
||||
- 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.
|
||||
- `ssh_server_revoked_keys`
|
||||
- Default: `[]`
|
||||
- Description: a list of revoked public keys that the ssh server will always reject, useful to revoke known weak or compromised keys.
|
||||
- `ssh_max_startups`
|
||||
- Default: `'10:30:60'`
|
||||
- Description: Specifies the maximum number of concurrent unauthenticated connections to the SSH daemon.
|
||||
- `ssh_macs`
|
||||
- Default: `[]`
|
||||
- Description: Change this list to overwrite macs. Defaults found in `defaults/main.yml`.
|
||||
- `ssh_kex`
|
||||
- Default: `[]`
|
||||
- Description: Change this list to overwrite kexs. Defaults found in `defaults/main.yml`.
|
||||
- `ssh_ciphers`
|
||||
- Default: `[]`
|
||||
- Description: Change this list to overwrite ciphers. Defaults found in `defaults/main.yml`.
|
||||
- `ssh_custom_options`
|
||||
- Default: `[]`
|
||||
- Description: Custom lines for SSH client configuration.
|
||||
- `sshd_custom_options`
|
||||
- Default: `[]`
|
||||
- Description: Custom lines for SSH daemon configuration.
|
||||
- `sshd_syslog_facility`
|
||||
- Default: `'AUTH'`
|
||||
- Description: The facility code that is used when logging messages from sshd.
|
||||
- `sshd_log_level`
|
||||
- Default: `'VERBOSE'`
|
||||
- Description: the verbosity level that is used when logging messages from sshd.
|
||||
- `sshd_strict_modes`
|
||||
- Default: `true`
|
||||
- Description: Check file modes and ownership of the user's files and home directory before accepting login.
|
||||
- `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`.
|
||||
|
||||
## Example Playbook
|
||||
|
||||
```yml
|
||||
- hosts: localhost
|
||||
collections:
|
||||
- devsec.hardening
|
||||
roles:
|
||||
- ssh_hardening
|
||||
```
|
||||
|
||||
## Configuring settings not listed in role-variables
|
||||
|
||||
If you want to configure ssh options that are not listed above, you can use `ssh_custom_options` (for `/etc/ssh/ssh_config`) or `sshd_custom_options` (for `/etc/ssh/sshd_config`) to set them. These options will be set on the **beginning** of the file so you can override options further down in the file.
|
||||
@@ -261,10 +18,8 @@ Example playbook:
|
||||
|
||||
```yml
|
||||
- hosts: localhost
|
||||
collections:
|
||||
- devsec.hardening
|
||||
roles:
|
||||
- ssh_hardening
|
||||
- devsec.hardening.ssh_hardening
|
||||
vars:
|
||||
ssh_custom_options:
|
||||
- "Include /etc/ssh/ssh_config.d/*"
|
||||
@@ -281,3 +36,444 @@ If you use this role to disable SFTP (`sftp_enabled: false`) you will get errors
|
||||
This role uses the default port 22 or the port configured in the inventory to connect to the server. If the default `ssh` port is changed via `ssh_server_ports`, once the ssh server is restarted, it will still try to connect using the previous port. In order to run this role again on the same server the inventory will have to be updated to use the new ssh port.
|
||||
|
||||
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.
|
||||
|
||||
<!-- BEGIN_ANSIBLE_DOCS -->
|
||||
|
||||
## Supported Operating Systems
|
||||
|
||||
- EL
|
||||
- 7, 8, 9
|
||||
- Ubuntu
|
||||
- bionic, focal, jammy
|
||||
- Debian
|
||||
- buster, bullseye
|
||||
- Amazon
|
||||
- Fedora
|
||||
- ArchLinux
|
||||
- SmartOS
|
||||
- FreeBSD
|
||||
- 12.2, 13.2, 14.0
|
||||
- OpenBSD
|
||||
- 7.0
|
||||
|
||||
## Role Variables
|
||||
|
||||
- `network_ipv6_enable`
|
||||
- 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`
|
||||
- Description: Set to `false` to disable chroot for sftp.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `sftp_chroot_dir`
|
||||
- Default: `/home/%u`
|
||||
- Description: change default stp chroot location
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `sftp_enabled`
|
||||
- Default: `true`
|
||||
- Description: Set to `false` to disable sftp configuration.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `sftp_umask`
|
||||
- Default: `0027`
|
||||
- Description: Specifies the umask for sftp.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_allow_agent_forwarding`
|
||||
- Default: `false`
|
||||
- Description: Set to `false` to disable Agent Forwarding. Set to `true` to allow Agent Forwarding.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_allow_groups`
|
||||
- Default: ``
|
||||
- Description: if specified, login is allowed only for users whose primary group or supplementary group list matches one of the patterns.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_allow_tcp_forwarding`
|
||||
- Default: `no`
|
||||
- Description: Set to `'no'` or `false` to disable TCP Forwarding. Set to `'yes'` or`True` to allow TCP Forwarding. If you are using OpenSSH >= 6.2 version, you can specify `'yes'`, `'no'`, `'all'`, `'local'`or`'remote'`.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_allow_users`
|
||||
- Default: ``
|
||||
- Description: if specified, login is allowed only for user names that match one of the patterns.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_authorized_keys_file`
|
||||
- Default: ``
|
||||
- Description: change default file that contains the public keys that can be used for user authentication
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_authorized_principals`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_authorized_principals_file`
|
||||
- Default: ``
|
||||
- Description: specifies the file containing principals that are allowed. Only used if `ssh_trusted_user_ca_keys_file` is set.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_banner`
|
||||
- Default: `false`
|
||||
- Description: Set to `true` to print a banner on login.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_banner_path`
|
||||
- Default: `/etc/sshd/banner.txt`
|
||||
- Description: path to the SSH banner file.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_challengeresponseauthentication`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_client_alive_count`
|
||||
- Default: `3`
|
||||
- Description: Defines the number of acceptable unanswered client alive messages before disconnecting clients.
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `ssh_client_alive_interval`
|
||||
- Default: `300`
|
||||
- Description: specifies an interval for sending keepalive messages.
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `ssh_client_compression`
|
||||
- Default: `false`
|
||||
- Description: Specifies whether the client requests compression.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_client_config_file`
|
||||
- Default: `/etc/ssh/ssh_config`
|
||||
- Description: path of the ssh client configuration file, e.g. `/etc/ssh/ssh_config.d/custom.conf`.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_client_hardening`
|
||||
- Default: `true`
|
||||
- Description: Set to `false` to stop harden the client.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_client_host_key_algorithms`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_client_password_login`
|
||||
- Default: `false`
|
||||
- Description: Set to `true` to allow password-based authentication with the ssh client.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_client_port`
|
||||
- Default: `22`
|
||||
- Description: Specifies the port number to connect on the remote host.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_client_roaming`
|
||||
- Default: `false`
|
||||
- Description: enable experimental client roaming.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_compression`
|
||||
- Default: `false`
|
||||
- Description: Specifies whether server-side compression is enabled after the user has authenticated successfully.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_custom_options`
|
||||
- Default: ``
|
||||
- Description: Custom lines for SSH client configuration.
|
||||
- Type: list
|
||||
- Required: no
|
||||
- `ssh_custom_selinux_dir`
|
||||
- Default: `/etc/selinux/local-policies`
|
||||
- Description: directory where to store the ssh_password policy
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_deny_groups`
|
||||
- Default: ``
|
||||
- Description: if specified, login is disallowed for users whose primary group or supplementary group list matches one of the patterns.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_deny_users`
|
||||
- Default: ``
|
||||
- Description: if specified, login is disallowed for user names that match one of the patterns.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_gateway_ports`
|
||||
- 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: bool
|
||||
- Required: no
|
||||
- `ssh_gssapi_delegation`
|
||||
- Default: `false`
|
||||
- Description: Set to `true` to enable GSSAPI credential forwarding.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_gssapi_support`
|
||||
- Default: `false`
|
||||
- Description: Set to `true` to enable GSSAPI authentication (both client and server).
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_hardening_enabled`
|
||||
- Default: `true`
|
||||
- Description: Whether to run the hardening
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_host_certificates`
|
||||
- Default: ``
|
||||
- Description: Host certificates to look for when starting sshd
|
||||
- Type: list
|
||||
- Required: no
|
||||
- `ssh_host_key_algorithms`
|
||||
- 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
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_host_rsa_key_size`
|
||||
- Default: `4096`
|
||||
- Description: Specifies the number of bits in the private host RSA key to create.
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `ssh_kerberos_support`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_listen_to`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_login_grace_time`
|
||||
- Default: `30s`
|
||||
- Description: specifies the time allowed for successful authentication to the SSH server.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_macs`
|
||||
- Default: ``
|
||||
- Description: Change this list to overwrite macs. Defaults found in `defaults/main.yml`
|
||||
- Type: list
|
||||
- Required: no
|
||||
- `ssh_max_auth_retries`
|
||||
- Default: `2`
|
||||
- Description: Specifies the maximum number of authentication attempts permitted per connection.
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `ssh_max_sessions`
|
||||
- Default: `10`
|
||||
- Description: Specifies the maximum number of open sessions permitted from a given connection.
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `ssh_max_startups`
|
||||
- Default: `10:30:60`
|
||||
- Description: Specifies the maximum number of concurrent unauthenticated connections to the SSH daemon.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_pam_support`
|
||||
- Default: `true`
|
||||
- Description: Set to `true` if SSH has PAM support.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_permit_root_login`
|
||||
- Default: `no`
|
||||
- Description: Disable root-login. Set to `'without-password'` or `'yes'` to enable root-login - The quotes are required!
|
||||
- Type: str
|
||||
- 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.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- Choices:
|
||||
- no
|
||||
- yes
|
||||
- point-to-point
|
||||
- ethernet
|
||||
- `ssh_print_debian_banner`
|
||||
- Default: `false`
|
||||
- Description: Set to `true` to print debian specific banner.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_print_last_log`
|
||||
- Default: `false`
|
||||
- Description: Set to `false` to disable display of last login information.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_print_motd`
|
||||
- Default: `false`
|
||||
- Description: Set to `false` to disable printing of the MOTD.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_print_pam_motd`
|
||||
- Default: `false`
|
||||
- Description: Set to `false` to disable printing of the MOTD via pam (Debian and Ubuntu).
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_ps59`
|
||||
- Default: `sandbox`
|
||||
- Description: Specifies whether sshd separates privileges by creating an unprivileged child process to deal with incoming network traffic.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_remote_hosts`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_server_accept_env_vars`
|
||||
- Default: ``
|
||||
- Description: Specifies what environment variables sent by the client will be copied into the session's environment, multiple environment variables may be separated by whitespace.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_config_file`
|
||||
- Default: `/etc/ssh/sshd_config`
|
||||
- Description: path of the ssh server configuration file, e.g. `/etc/ssh/sshd_config.d/custom.conf`.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_enabled`
|
||||
- Default: `true`
|
||||
- Description: Set to `false` to disable the opensshd server.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_server_hardening`
|
||||
- Default: `true`
|
||||
- Description: Set to `false` to stop harden the server.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_server_match_address`
|
||||
- Default: ``
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_match_group`
|
||||
- Default: ``
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_match_local_port`
|
||||
- Default: ``
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_match_user`
|
||||
- Default: ``
|
||||
- Description: Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_password_login`
|
||||
- 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
|
||||
- `ssh_server_permit_environment_vars`
|
||||
- Default: `no`
|
||||
- Description: `yes` to specify that ~/.ssh/environment and environment= options in ~/.ssh/authorized_keys are processed by sshd. With openssh version 7.8 it is possible to specify a whitelist of environment variable names in addition to global 'yes' or 'no' settings.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_server_ports`
|
||||
- Default: `["22"]`
|
||||
- Description: ports on which ssh-server should listen.
|
||||
- Type: list
|
||||
- Required: no
|
||||
- `ssh_server_revoked_keys`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_trusted_user_ca_keys`
|
||||
- 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
|
||||
- Required: no
|
||||
- `ssh_trusted_user_ca_keys_file`
|
||||
- Default: ``
|
||||
- Description: specifies the file containing trusted certificate authorities public keys used to sign user certificates.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `ssh_use_dns`
|
||||
- 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`
|
||||
- Description: Set to `false` to disable pam authentication.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `ssh_x11_forwarding`
|
||||
- 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: ``
|
||||
- Description: Custom lines for SSH daemon configuration.
|
||||
- Type: list
|
||||
- Required: no
|
||||
- `sshd_log_level`
|
||||
- Default: `VERBOSE`
|
||||
- Description: the verbosity level that is used when logging messages from sshd.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `sshd_moduli_file`
|
||||
- Default: `/etc/ssh/moduli`
|
||||
- Description: path to the SSH moduli file.
|
||||
- Type: str
|
||||
- Required: no
|
||||
- `sshd_moduli_minimum`
|
||||
- Default: `2048`
|
||||
- Description: remove Diffie-Hellman parameters smaller than the defined size to mitigate logjam.
|
||||
- Type: int
|
||||
- Required: no
|
||||
- `sshd_strict_modes`
|
||||
- Default: `true`
|
||||
- Description: Check file modes and ownership of the user's files and home directory before accepting login.
|
||||
- Type: bool
|
||||
- Required: no
|
||||
- `sshd_syslog_facility`
|
||||
- Default: `AUTH`
|
||||
- Description: The facility code that is used when logging messages from sshd.
|
||||
- Type: str
|
||||
- Required: no
|
||||
|
||||
## Dependencies
|
||||
|
||||
None.
|
||||
|
||||
## Example Playbook
|
||||
|
||||
```
|
||||
- hosts: all
|
||||
roles:
|
||||
- name: devsec.hardening.ssh_hardening
|
||||
```
|
||||
|
||||
<!-- END_ANSIBLE_DOCS -->
|
||||
@@ -65,7 +65,7 @@ ssh_client_alive_interval: 300 # sshd
|
||||
ssh_client_alive_count: 3 # sshd
|
||||
|
||||
# Allow SSH Tunnels
|
||||
ssh_permit_tunnel: false
|
||||
ssh_permit_tunnel: "no"
|
||||
|
||||
# Hosts with custom options. # ssh
|
||||
# Example:
|
||||
@@ -96,6 +96,9 @@ ssh_x11_forwarding: false # sshd
|
||||
# false to disable pam authentication.
|
||||
ssh_use_pam: true # sshd
|
||||
|
||||
# false to disable publickey authentication
|
||||
ssh_pubkey_authentication: true
|
||||
|
||||
# specify AuthenticationMethods
|
||||
sshd_authenticationmethods: publickey
|
||||
|
||||
|
||||
@@ -0,0 +1,367 @@
|
||||
---
|
||||
argument_specs:
|
||||
main:
|
||||
short_description: The main entry point for the ssh hardening role.
|
||||
version_added: 8.8.0
|
||||
options:
|
||||
network_ipv6_enable:
|
||||
default: true
|
||||
type: bool
|
||||
description: '`false` if IPv6 is not needed. `ssh_listen_to` must also be
|
||||
set to listen to IPv6 addresses (for example `[::]`).'
|
||||
ssh_client_config_file:
|
||||
default: /etc/ssh/ssh_config
|
||||
description: path of the ssh client configuration file, e.g. `/etc/ssh/ssh_config.d/custom.conf`.
|
||||
ssh_server_config_file:
|
||||
default: /etc/ssh/sshd_config
|
||||
description: path of the ssh server configuration file, e.g. `/etc/ssh/sshd_config.d/custom.conf`.
|
||||
ssh_server_ports:
|
||||
default: ['22']
|
||||
type: list
|
||||
description: ports on which ssh-server should listen.
|
||||
ssh_client_port:
|
||||
default: '22'
|
||||
description: Specifies the port number to connect on the remote host.
|
||||
ssh_listen_to:
|
||||
default: [0.0.0.0]
|
||||
type: list
|
||||
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
|
||||
ssh_host_key_files:
|
||||
default: []
|
||||
type: list
|
||||
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.
|
||||
ssh_host_rsa_key_size:
|
||||
default: 4096
|
||||
type: int
|
||||
description: Specifies the number of bits in the private host RSA key to create.
|
||||
ssh_host_key_algorithms:
|
||||
default: []
|
||||
type: list
|
||||
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
|
||||
ssh_client_host_key_algorithms:
|
||||
default: []
|
||||
type: list
|
||||
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!
|
||||
ssh_client_alive_interval:
|
||||
default: 300
|
||||
description: specifies an interval for sending keepalive messages.
|
||||
type: int
|
||||
ssh_client_alive_count:
|
||||
default: 3
|
||||
description: Defines the number of acceptable unanswered client alive messages
|
||||
before disconnecting clients.
|
||||
type: int
|
||||
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.
|
||||
choices:
|
||||
- 'no'
|
||||
- 'yes'
|
||||
- point-to-point
|
||||
- ethernet
|
||||
ssh_remote_hosts:
|
||||
default: []
|
||||
type: list
|
||||
description: one or more hosts and their custom options for the ssh-client.
|
||||
Default is empty. See examples in `defaults/main.yml`
|
||||
ssh_permit_root_login:
|
||||
default: 'no'
|
||||
description: Disable root-login. Set to `'without-password'` or `'yes'` to
|
||||
enable root-login - The quotes are required!
|
||||
ssh_allow_tcp_forwarding:
|
||||
default: 'no'
|
||||
description: Set to `'no'` or `false` to disable TCP Forwarding. Set to `'yes'`
|
||||
or`True` to allow TCP Forwarding. If you are using OpenSSH >= 6.2 version,
|
||||
you can specify `'yes'`, `'no'`, `'all'`, `'local'`or`'remote'`.
|
||||
ssh_gateway_ports:
|
||||
default: false
|
||||
type: bool
|
||||
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.
|
||||
ssh_allow_agent_forwarding:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `false` to disable Agent Forwarding. Set to `true` to
|
||||
allow Agent Forwarding.
|
||||
ssh_x11_forwarding:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `false` to disable X11 Forwarding. Set to `true` to allow
|
||||
X11 Forwarding.
|
||||
ssh_pam_support:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `true` if SSH has PAM support.
|
||||
ssh_use_pam:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to disable pam authentication.
|
||||
ssh_gssapi_support:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `true` to enable GSSAPI authentication (both client and
|
||||
server).
|
||||
ssh_gssapi_delegation:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `true` to enable GSSAPI credential forwarding.
|
||||
ssh_kerberos_support:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `true` if SSH has Kerberos support.
|
||||
ssh_deny_users:
|
||||
default: ''
|
||||
description: if specified, login is disallowed for user names that match one
|
||||
of the patterns.
|
||||
ssh_allow_users:
|
||||
default: ''
|
||||
description: if specified, login is allowed only for user names that match
|
||||
one of the patterns.
|
||||
ssh_deny_groups:
|
||||
default: ''
|
||||
description: if specified, login is disallowed for users whose primary group
|
||||
or supplementary group list matches one of the patterns.
|
||||
ssh_allow_groups:
|
||||
default: ''
|
||||
description: if specified, login is allowed only for users whose primary group
|
||||
or supplementary group list matches one of the patterns.
|
||||
ssh_authorized_keys_file:
|
||||
default: ''
|
||||
description: change default file that contains the public keys that can be
|
||||
used for user authentication
|
||||
ssh_trusted_user_ca_keys_file:
|
||||
default: ''
|
||||
description: specifies the file containing trusted certificate authorities
|
||||
public keys used to sign user certificates.
|
||||
ssh_trusted_user_ca_keys:
|
||||
default: []
|
||||
type: list
|
||||
description: set the trusted certificate authorities public keys used to sign
|
||||
user certificates. Only used if `ssh_trusted_user_ca_keys_file` is set.
|
||||
ssh_authorized_principals_file:
|
||||
default: ''
|
||||
description: specifies the file containing principals that are allowed. Only
|
||||
used if `ssh_trusted_user_ca_keys_file` is set.
|
||||
ssh_authorized_principals:
|
||||
default: []
|
||||
type: list
|
||||
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
|
||||
ssh_print_motd:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `false` to disable printing of the MOTD.
|
||||
ssh_print_pam_motd:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `false` to disable printing of the MOTD via pam (Debian
|
||||
and Ubuntu).
|
||||
ssh_print_last_log:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `false` to disable display of last login information.
|
||||
sftp_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to disable sftp configuration.
|
||||
sftp_umask:
|
||||
default: '0027'
|
||||
description: Specifies the umask for sftp.
|
||||
sftp_chroot:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to disable chroot for sftp.
|
||||
sftp_chroot_dir:
|
||||
default: /home/%u
|
||||
description: change default stp chroot location
|
||||
ssh_client_roaming:
|
||||
default: false
|
||||
type: bool
|
||||
description: enable experimental client roaming.
|
||||
sshd_moduli_file:
|
||||
default: /etc/ssh/moduli
|
||||
description: path to the SSH moduli file.
|
||||
sshd_moduli_minimum:
|
||||
default: 2048
|
||||
description: remove Diffie-Hellman parameters smaller than the defined size
|
||||
to mitigate logjam.
|
||||
type: int
|
||||
ssh_challengeresponseauthentication:
|
||||
default: false
|
||||
type: bool
|
||||
description: Specifies whether challenge-response authentication is allowed
|
||||
(e.g. via PAM).
|
||||
ssh_client_password_login:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `true` to allow password-based authentication with the
|
||||
ssh client.
|
||||
ssh_server_password_login:
|
||||
default: false
|
||||
type: bool
|
||||
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`.'
|
||||
ssh_banner:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `true` to print a banner on login.
|
||||
ssh_banner_path:
|
||||
default: /etc/sshd/banner.txt
|
||||
description: path to the SSH banner file.
|
||||
ssh_client_hardening:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to stop harden the client.
|
||||
ssh_client_compression:
|
||||
default: false
|
||||
type: bool
|
||||
description: Specifies whether the client requests compression.
|
||||
ssh_compression:
|
||||
default: false
|
||||
type: bool
|
||||
description: Specifies whether server-side compression is enabled after the
|
||||
user has authenticated successfully.
|
||||
ssh_login_grace_time:
|
||||
default: 30s
|
||||
description: specifies the time allowed for successful authentication to the
|
||||
SSH server.
|
||||
ssh_max_auth_retries:
|
||||
default: 2
|
||||
description: Specifies the maximum number of authentication attempts permitted
|
||||
per connection.
|
||||
type: int
|
||||
ssh_max_sessions:
|
||||
default: 10
|
||||
description: Specifies the maximum number of open sessions permitted from
|
||||
a given connection.
|
||||
type: int
|
||||
ssh_print_debian_banner:
|
||||
default: false
|
||||
type: bool
|
||||
description: Set to `true` to print debian specific banner.
|
||||
ssh_server_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to disable the opensshd server.
|
||||
ssh_server_hardening:
|
||||
default: true
|
||||
type: bool
|
||||
description: Set to `false` to stop harden the server.
|
||||
ssh_server_match_address:
|
||||
default: ''
|
||||
description: Introduces a conditional block. If all of the criteria on the
|
||||
Match line are satisfied, the keywords on the following lines override those
|
||||
set in the global section of the config file, until either another Match
|
||||
line or the end of the file.
|
||||
ssh_server_match_group:
|
||||
default: ''
|
||||
description: Introduces a conditional block. If all of the criteria on the
|
||||
Match line are satisfied, the keywords on the following lines override those
|
||||
set in the global section of the config file, until either another Match
|
||||
line or the end of the file.
|
||||
ssh_server_match_user:
|
||||
default: ''
|
||||
description: Introduces a conditional block. If all of the criteria on the
|
||||
Match line are satisfied, the keywords on the following lines override those
|
||||
set in the global section of the config file, until either another Match
|
||||
line or the end of the file.
|
||||
ssh_server_match_local_port:
|
||||
default: ''
|
||||
description: Introduces a conditional block. If all of the criteria on the
|
||||
Match line are satisfied, the keywords on the following lines override those
|
||||
set in the global section of the config file, until either another Match
|
||||
line or the end of the file.
|
||||
ssh_server_permit_environment_vars:
|
||||
default: 'no'
|
||||
description: "`yes` to specify that ~/.ssh/environment and environment= options\
|
||||
\ in ~/.ssh/authorized_keys are processed by sshd. With openssh version\
|
||||
\ 7.8 it is possible to specify a whitelist of environment variable names\
|
||||
\ in addition to global 'yes' or 'no' settings."
|
||||
ssh_server_accept_env_vars:
|
||||
default: ''
|
||||
description: Specifies what environment variables sent by the client will
|
||||
be copied into the session's environment, multiple environment variables
|
||||
may be separated by whitespace.
|
||||
ssh_use_dns:
|
||||
default: false
|
||||
type: bool
|
||||
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.
|
||||
ssh_server_revoked_keys:
|
||||
default: []
|
||||
type: list
|
||||
description: a list of revoked public keys that the ssh server will always
|
||||
reject, useful to revoke known weak or compromised keys.
|
||||
ssh_max_startups:
|
||||
default: 10:30:60
|
||||
description: Specifies the maximum number of concurrent unauthenticated connections
|
||||
to the SSH daemon.
|
||||
ssh_macs:
|
||||
default: []
|
||||
type: list
|
||||
description: Change this list to overwrite macs. Defaults found in `defaults/main.yml`
|
||||
ssh_kex:
|
||||
default: []
|
||||
type: list
|
||||
description: Change this list to overwrite kexs. Defaults found in `defaults/main.yml`
|
||||
ssh_ciphers:
|
||||
default: []
|
||||
type: list
|
||||
description: Change this list to overwrite ciphers. Defaults found in `defaults/main.yml`
|
||||
ssh_custom_options:
|
||||
default: []
|
||||
type: list
|
||||
description: Custom lines for SSH client configuration.
|
||||
sshd_custom_options:
|
||||
default: []
|
||||
type: list
|
||||
description: Custom lines for SSH daemon configuration.
|
||||
sshd_syslog_facility:
|
||||
default: AUTH
|
||||
description: The facility code that is used when logging messages from sshd.
|
||||
type: str
|
||||
sshd_log_level:
|
||||
default: VERBOSE
|
||||
description: the verbosity level that is used when logging messages from sshd.
|
||||
sshd_strict_modes:
|
||||
default: true
|
||||
type: bool
|
||||
description: Check file modes and ownership of the user's files and home directory
|
||||
before accepting login.
|
||||
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`
|
||||
ssh_custom_selinux_dir:
|
||||
default: /etc/selinux/local-policies
|
||||
description: directory where to store the ssh_password policy
|
||||
ssh_hardening_enabled:
|
||||
default: true
|
||||
type: bool
|
||||
description: Whether to run the hardening
|
||||
ssh_host_certificates:
|
||||
default: []
|
||||
type: list
|
||||
description: Host certificates to look for when starting sshd
|
||||
ssh_ps59:
|
||||
default: sandbox
|
||||
description: Specifies whether sshd separates privileges by creating an unprivileged
|
||||
child process to deal with incoming network traffic.
|
||||
@@ -27,6 +27,8 @@ galaxy_info:
|
||||
- name: FreeBSD
|
||||
versions:
|
||||
- "12.2"
|
||||
- "13.2"
|
||||
- "14.0"
|
||||
- name: OpenBSD
|
||||
versions:
|
||||
- "7.0"
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
mode: "0600"
|
||||
owner: "{{ ssh_owner }}"
|
||||
group: "{{ ssh_group }}"
|
||||
validate: "{{ sshd_path }} -T -C user=root -C host=localhost -C addr=localhost -C lport=22 -f %s"
|
||||
validate: "{{ sshd_path }} -G -f %s"
|
||||
notify: Restart sshd
|
||||
when: ssh_server_hardening | bool
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ MaxSessions {{ ssh_max_sessions }}
|
||||
MaxStartups {{ ssh_max_startups }}
|
||||
|
||||
# Enable public key authentication
|
||||
PubkeyAuthentication yes
|
||||
PubkeyAuthentication {{ 'yes' if (ssh_pubkey_authentication|bool) else 'no' }}
|
||||
|
||||
# Never use host-based authentication. It can be exploited.
|
||||
IgnoreRhosts yes
|
||||
@@ -192,7 +192,7 @@ ClientAliveInterval {{ ssh_client_alive_interval }}
|
||||
ClientAliveCountMax {{ ssh_client_alive_count }}
|
||||
|
||||
# Disable tunneling
|
||||
PermitTunnel {{ 'yes' if (ssh_permit_tunnel|bool) else 'no' }}
|
||||
PermitTunnel {{ ssh_permit_tunnel }}
|
||||
|
||||
# Disable forwarding tcp connections.
|
||||
# no real advantage without denied shell access
|
||||
|
||||
Reference in new issue
Block a user