Compare commits

...
Author SHA1 Message Date
Sebastian Gumprich cbab91c423 remove local test
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-08-08 13:27:28 +02:00
Sebastian Gumprich 5e6164abb1 use full path for pam-tester in os_hardening_vm tests
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-08-08 09:36:09 +02:00
Sebastian Gumprich f1ec9f2c78 install python3, pip so we can then install pam-tester
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-08-08 09:05:02 +02:00
Sebastian Gumprich 8220ae9da0 fix linting errors 2023-08-08 09:04:30 +02:00
Sebastian Gumprich a9f19a0bdf switch to ghcr images
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-08-08 09:01:36 +02:00
Sebastian GumprichandSebastian Gumprich e3273a8d54 disable pam tests (#691)
Signed-off-by: Sebastian Gumprich <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
2023-08-07 14:38:44 +02:00
dev-sec CI ca5484f96e update changelog 2023-08-07 12:34:12 +00:00
rndmh3ro c1a0bcbe9d Prettified Code! 2023-08-07 12:31:26 +00:00
Sebastian GumprichandSebastian Gumprich f295397611 add role argument spec for os, ssh, mysql (#687)
* add role argument spec for os, ssh, mysql

Signed-off-by: Sebastian Gumprich <[email protected]>

* add role argument spec for os, ssh, mysql

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove variable in variable as it cannot be used in argument spec

Signed-off-by: Sebastian Gumprich <[email protected]>

* fix wrong syntax

* fix spelling errors

Signed-off-by: Sebastian Gumprich <[email protected]>

* cannot use vars before arg-spec validation

Signed-off-by: Sebastian Gumprich <[email protected]>

* yamllint the arg-spec

Signed-off-by: Sebastian Gumprich <[email protected]>

* add back variable

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove redundant setting in tests

* fix descriptions in mysql hardening to betterreflect what they do

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove duplicate empty line

Signed-off-by: Sebastian Gumprich <[email protected]>

* set correct defaults on to ssl options

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove left-over hidepid argument spec

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove license and author infos, this lives in the collection readme

Signed-off-by: Sebastian Gumprich <[email protected]>

* fix styling

Signed-off-by: Sebastian Gumprich <[email protected]>

* update some descriptions and sort them in the readme

Signed-off-by: Sebastian Gumprich <[email protected]>

* some more linting

Signed-off-by: Sebastian Gumprich <[email protected]>

---------

Signed-off-by: Sebastian Gumprich <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
2023-08-07 14:30:59 +02:00
dev-sec CI 96ba9d1d8d update galaxy.yml with new version 2023-08-04 11:32:54 +00:00
dev-sec CI 3fb0831d7b update changelog 2023-08-04 11:06:58 +00:00
Sebastian GumprichandSebastian Gumprich ef5e8801e4 add debian 12 support (#684)
* add debian 12 support

Signed-off-by: Sebastian Gumprich <[email protected]>

* temp disable pam-checks

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove debian12 from vagrant tests as there's no box yet

Signed-off-by: Sebastian Gumprich <[email protected]>

* use new pam-tester from pip

Signed-off-by: Sebastian Gumprich <[email protected]>

* use new pam-tester from pip

Signed-off-by: Sebastian Gumprich <[email protected]>

* add setuptoolks to pam-tester install

Signed-off-by: Sebastian Gumprich <[email protected]>

* add setuptoolks to pam-tester install

Signed-off-by: Sebastian Gumprich <[email protected]>

* add setuptoolks to pam-tester install

Signed-off-by: Sebastian Gumprich <[email protected]>

* add setuptoolks to pam-tester install

Signed-off-by: Sebastian Gumprich <[email protected]>

* install pam-tester with python3 and use full path to it

Signed-off-by: Sebastian Gumprich <[email protected]>

* install python3-setupttools in verify-tests

Signed-off-by: Sebastian Gumprich <[email protected]>

* fix path for pam-tester in all tests

Signed-off-by: Sebastian Gumprich <[email protected]>

* set python interpreter to 3 for verify-tests

Signed-off-by: Sebastian Gumprich <[email protected]>

* Revert "set python interpreter to 3 for verify-tests"

This reverts commit 00b6556e33.

* add back accidentally deleted tasks

Signed-off-by: Sebastian Gumprich <[email protected]>

---------

Signed-off-by: Sebastian Gumprich <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
2023-08-04 12:59:40 +02:00
dev-sec CI 9950f9ba52 update changelog 2023-07-24 09:37:51 +00:00
Dennis Lerch 6bcdb253ec auditd: add possibility to override config template (#685)
* make template overrideable

by referencing the auditd.conf.j2 template, a custom template can be provided to the role.

Signed-off-by: Dennis Lerch <[email protected]>

* extend auditd config

make freq and log_file configurable
implement write_logs with it's default value in order to be able to disable log writing

Signed-off-by: Dennis Lerch <[email protected]>

* Extend README.md documentation by new variables

reorder `os_auditd_log_format` to keep sequence from defaults

Signed-off-by: Dennis Lerch <[email protected]>

---------

Signed-off-by: Dennis Lerch <[email protected]>
2023-07-24 11:34:47 +02:00
dev-sec CI fc524f5369 update changelog 2023-06-20 13:22:05 +00:00
Sebastian Gumprich 790c7c5846 add var-naming[no-role-prefix] to skip-list (#679)
there's probably some added value for this, but I see no reason to change so many variables and possibly break something when it still works and nobody complained

Signed-off-by: Sebastian Gumprich <[email protected]>
2023-06-20 15:18:55 +02:00
dev-sec CI 45d6a17c08 update changelog 2023-06-12 12:22:09 +00:00
Nejc Habjan dd215ba310 feat: explicitly support Fedora 37 and 38 (#682)
Signed-off-by: Nejc Habjan <[email protected]>
2023-06-12 14:18:32 +02:00
dev-sec CI 1fb9988fd7 update changelog 2023-06-10 06:07:05 +00:00
Sebastian Gumprich f56d80b5d8 Replace ssh_keys group in Fedora with root (#677)
* Replace ssh_keys group in Fedora with root

In Fedora 38, the `ssh_keys` group was removed. root is used now, in accordance to upstream.

See: https://www.spinics.net/lists/fedora-devel/msg307707.html
See: https://src.fedoraproject.org/rpms/openssh/pull-request/37#

Signed-off-by: Sebastian Gumprich <[email protected]>

* change host key mode and owner in fedora and rhel9

Signed-off-by: Sebastian Gumprich <[email protected]>

* add missing host mode for rhel7

Signed-off-by: Sebastian Gumprich <[email protected]>

* harden all ssh host keys

Signed-off-by: Sebastian Gumprich <[email protected]>

* skip linting rule

Signed-off-by: Sebastian Gumprich <[email protected]>

* correct grp for bsd is wheel

Signed-off-by: Sebastian Gumprich <[email protected]>

---------

Signed-off-by: Sebastian Gumprich <[email protected]>
2023-06-10 08:04:04 +02:00
dev-sec CI 0e173b4165 update changelog 2023-05-26 12:13:00 +00:00
Sebastian Gumprich 7e6a715692 setting gets ignored (#680)
see: https://github.com/authselect/authselect/issues/223

Signed-off-by: Sebastian Gumprich <[email protected]>
2023-05-26 14:10:49 +02:00
dev-sec CI 9c86dae383 update changelog 2023-05-23 09:22:51 +00:00
junicastandJochen Demmer f3337f33b3 Add oddjob mkhomedir option rhel pam (#675)
* added support for oddjob mkhomedir via optional var

* optimized conditional

* added variable description

Signed-off-by: Jochen Demmer <[email protected]>

* added support for oddjob mkhomedir via optional var

Signed-off-by: Jochen Demmer <[email protected]>

* optimized conditional

Signed-off-by: Jochen Demmer <[email protected]>

* added variable description

Signed-off-by: Jochen Demmer <[email protected]>

---------

Signed-off-by: Jochen Demmer <[email protected]>
Co-authored-by: Jochen Demmer <[email protected]>
2023-05-23 11:19:40 +02:00
dev-sec CI c597eb97b2 update changelog 2023-05-22 13:56:42 +00:00
Andreas Wagnerandwhysthatso d7bda7ca3a expand on check conditions for non-file locations of logs (#674)
Co-authored-by: whysthatso <[email protected]>
2023-05-22 15:53:33 +02:00
dev-sec CI 037919e67a update changelog 2023-04-28 12:08:48 +00:00
schurzi ed5aefad3e Merge pull request #667 from dev-sec/molecule_update
use new molecule-plugins
2023-04-28 14:05:46 +02:00
Martin Schurz e5b8df07e2 use new molecule-plugins
Signed-off-by: Martin Schurz <[email protected]>
2023-04-28 13:48:45 +02:00
dev-sec CI 808cc6d78a update changelog 2023-04-17 07:51:08 +00:00
schurzi 1cce7bca9a Merge pull request #662 from dev-sec/codespell
add spellchecking with codespell
2023-04-17 09:47:53 +02:00
Martin Schurz 74c76b8240 correct workflow name and use main version
Signed-off-by: Martin Schurz <[email protected]>
2023-04-16 22:57:44 +02:00
Martin Schurz cd56c017ba add parameter for skipped words
Signed-off-by: Martin Schurz <[email protected]>
2023-04-16 22:54:43 +02:00
Martin Schurz 93ddd4b45e use shared workflow
Signed-off-by: Martin Schurz <[email protected]>
2023-04-16 22:49:53 +02:00
Martin Schurz 7259d6b5fd fix spelling errors
Signed-off-by: Martin Schurz <[email protected]>
2023-04-14 23:51:53 +02:00
Martin Schurz edcada16e4 add spellchecking with codespell
Signed-off-by: Martin Schurz <[email protected]>
2023-04-14 23:34:05 +02:00
dev-sec CI 7e31002555 update galaxy.yml with new version 2023-04-13 08:40:54 +00:00
dev-sec CI 8816969278 update changelog 2023-04-12 22:51:41 +00:00
schurzi 7e6e43e0a5 Merge pull request #657 from dev-sec/min_ansible_ver 2023-04-13 00:48:29 +02:00
dev-sec CI b79eb83d4f update changelog 2023-04-12 20:24:10 +00:00
Martin Schurz eb47f4dce0 Merge branch 'master' into min_ansible_ver 2023-04-12 22:22:36 +02:00
schurzi 4a21ec0234 Merge pull request #656 from dev-sec/update_Tests
Update test environment
2023-04-12 22:21:49 +02:00
Martin Schurz bb47300798 remove unneccessary collection include
Signed-off-by: Martin Schurz <[email protected]>
2023-04-12 20:27:35 +02:00
Martin Schurz de0439ed58 remove unneccessary collection include
Signed-off-by: Martin Schurz <[email protected]>
2023-04-12 20:22:22 +02:00
Martin Schurz 6e48f686a9 add fedora to testing
Signed-off-by: Martin Schurz <[email protected]>
2023-04-12 20:21:27 +02:00
Martin Schurz 0014a3be36 update metadata
Signed-off-by: Martin Schurz <[email protected]>
2023-04-12 20:18:29 +02:00
Martin Schurz a186760b45 exclude broken tests
Signed-off-by: Martin Schurz <[email protected]>
2023-04-11 09:51:05 +02:00
Martin Schurz a5a065f880 shorten text
Signed-off-by: Martin Schurz <[email protected]>
2023-04-11 07:49:38 +02:00
Martin Schurz bc9795c215 add noqa for linter
Signed-off-by: Martin Schurz <[email protected]>
2023-04-11 07:37:07 +02:00
Martin Schurz f02f8b9a90 add procps for Debian
Signed-off-by: Martin Schurz <[email protected]>
2023-04-11 07:20:44 +02:00
Martin Schurz 5cc7b8dee3 add waivers for os_hardening
Signed-off-by: Martin Schurz <[email protected]>
2023-04-11 07:17:29 +02:00
Martin Schurz ea922f6dca fix lint error
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 23:49:52 +02:00
Martin Schurz e43f180112 update waiver path
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 23:48:52 +02:00
Martin Schurz 001900ac35 require ansible.builtin.user to be at least 2.11 since options are needed
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 23:42:27 +02:00
Martin Schurz 31c9885610 use docker for inspec-auditor
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 23:22:41 +02:00
Martin Schurz 4a9d6033eb try docker for inspec-auditor
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 23:04:46 +02:00
Martin Schurz ebab98930c try docker for inspec-auditor
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 22:58:28 +02:00
Martin Schurz 5357f9e718 use current version of amazon linux
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 22:23:48 +02:00
Martin Schurz dd5ad568b3 fix deprecation warnings
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 20:36:03 +02:00
Martin Schurz 63dc9d3be8 use current amazon linux
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 19:44:01 +02:00
Martin Schurz 7b69c4bd47 add collection link
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 11:21:12 +02:00
Martin Schurz e4ecfe2084 add collection to verify
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 11:03:33 +02:00
Martin Schurz e346c2300f remove unneccessary symlink
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 11:02:33 +02:00
Martin Schurz 2de009e3b5 use latest runner version
Signed-off-by: Martin Schurz <[email protected]>
2023-04-10 10:28:11 +02:00
dev-sec CI 604c6999ad update changelog 2023-03-31 08:14:01 +00:00
schurzi 29f8a2fb78 add testing for OpenBSD and FreeBSD (#642)
* add testing for OpenBSD and FreeBSD

Signed-off-by: Martin Schurz <[email protected]>

* make python work

Signed-off-by: Martin Schurz <[email protected]>

* remove jinja template ...

Signed-off-by: Martin Schurz <[email protected]>

* make verify work

Signed-off-by: Martin Schurz <[email protected]>

* correct verify

Signed-off-by: Martin Schurz <[email protected]>

* correct verify

Signed-off-by: Martin Schurz <[email protected]>

* correct verify

Signed-off-by: Martin Schurz <[email protected]>

* correct verify

Signed-off-by: Martin Schurz <[email protected]>

* use right vm name for connect

Signed-off-by: Martin Schurz <[email protected]>

* add a bit of documentation

Signed-off-by: Martin Schurz <[email protected]>

* remove sudo

Signed-off-by: Martin Schurz <[email protected]>

* add weird OpenSBD workaround

Signed-off-by: Martin Schurz <[email protected]>

* make verify playbook more consistent

Signed-off-by: Martin Schurz <[email protected]>

* rename nonlinux to BSD

Signed-off-by: Martin Schurz <[email protected]>

* use openbsd7 for testing

Signed-off-by: Martin Schurz <[email protected]>

* correct use openbsd7 everywhere

Signed-off-by: Martin Schurz <[email protected]>

* add waivers

Signed-off-by: Martin Schurz <[email protected]>

* update waiver descriptions

Signed-off-by: Martin Schurz <[email protected]>

* use docker for inspec

Signed-off-by: Martin Schurz <[email protected]>

* keep looking right ;)

Signed-off-by: Martin Schurz <[email protected]>

* correct path to waivers

Signed-off-by: Martin Schurz <[email protected]>

* use ephemeral directory in docker

Signed-off-by: Martin Schurz <[email protected]>

* use bsd inspec profile

Signed-off-by: Martin Schurz <[email protected]>

* remove openbsd workaround

Signed-off-by: Martin Schurz <[email protected]>

* re-add openbsd workaround

Signed-off-by: Martin Schurz <[email protected]>

* commit suggestions

Signed-off-by: Martin Schurz <[email protected]>

* add supportet OS to metadata

Signed-off-by: Martin Schurz <[email protected]>

* use current python

Signed-off-by: Martin Schurz <[email protected]>

---------

Signed-off-by: Martin Schurz <[email protected]>
2023-03-31 09:50:04 +02:00
schurzi b01f22b4a4 Merge pull request #654 from dev-sec/renovate/geerlingguy.git-3.x
Update dependency geerlingguy.git to v3.0.1
2023-03-31 09:26:49 +02:00
dev-sec CI 4a8ce39304 update changelog 2023-03-31 07:18:16 +00:00
renovate[bot] 32cc9665dd Update dependency geerlingguy.git to v3.0.1
Signed-off-by: Renovate Bot <[email protected]>
2023-03-31 07:15:43 +00:00
schurzi 0bfd5f7fa0 Merge pull request #653 from dev-sec/renovate/configure
Configure Renovate
2023-03-31 09:15:10 +02:00
Martin Schurz e9fa44c243 remove dependabot
Signed-off-by: Martin Schurz <[email protected]>
2023-03-31 09:12:55 +02:00
Martin Schurz 7456e441fc ignore jenovate in galaxy build
Signed-off-by: Martin Schurz <[email protected]>
2023-03-30 18:09:20 +02:00
Martin Schurz 4c7e189e5d add custom renovate config
Signed-off-by: Martin Schurz <[email protected]>
2023-03-30 18:05:39 +02:00
renovate[bot] cb15672c59 Add renovate.json 2023-03-30 00:02:32 +00:00
dev-sec CI 0b989fa0ab update changelog 2023-03-09 08:41:34 +00:00
schurzi 5ed3f399f2 add check mode to molecule tests (#644)
* add check mode to molecule tests

Signed-off-by: Martin Schurz <[email protected]>

* bail on undefined variables

Signed-off-by: Martin Schurz <[email protected]>

* bail on undefined variables

Signed-off-by: Martin Schurz <[email protected]>

* execute tasks in check mode

Signed-off-by: Martin Schurz <[email protected]>

* fix error in check mode on SuSE

Signed-off-by: Martin Schurz <[email protected]>

* use when condition on task

Signed-off-by: Martin Schurz <[email protected]>

---------

Signed-off-by: Martin Schurz <[email protected]>
2023-03-09 09:37:59 +01:00
dev-sec CI cd6be79f89 update changelog 2023-03-06 11:10:57 +00:00
George Bolo 3d0b6670d1 fixes #646 - add another condition to getent task (#647)
Signed-off-by: gbolo <[email protected]>
2023-03-06 12:07:40 +01:00
dev-sec CI 879ecefd8c update changelog 2023-03-01 13:23:09 +00:00
schurzi 6e5621cdc9 simplify MySQL queries for user deletion (#641)
* use rowcount to determine mysql results

Signed-off-by: Martin Schurz <[email protected]>

* use correct list level

Signed-off-by: Martin Schurz <[email protected]>

* remove json_query

Signed-off-by: Martin Schurz <[email protected]>

* remove intermediate vars

Signed-off-by: Martin Schurz <[email protected]>

* add check for count

Signed-off-by: Martin Schurz <[email protected]>

* drop condition, since one result must exist

Signed-off-by: Martin Schurz <[email protected]>

* move rowcount in condition

Signed-off-by: Martin Schurz <[email protected]>

* do loop in ansible to report each deleted user

Signed-off-by: Martin Schurz <[email protected]>

* add idempotency check

Signed-off-by: Martin Schurz <[email protected]>

* additional tests to verify user deletion

Signed-off-by: Martin Schurz <[email protected]>

* actually iterate the whole user list when deleting

Signed-off-by: Martin Schurz <[email protected]>

* fix tests for SuSE

Signed-off-by: Martin Schurz <[email protected]>

* adopt suggestions

Signed-off-by: Martin Schurz <[email protected]>

---------

Signed-off-by: Martin Schurz <[email protected]>
2023-03-01 14:19:50 +01:00
dev-sec CI 2d721248a1 update changelog 2023-02-21 13:11:23 +00:00
schurzi 271414bf44 Merge pull request #639 from dev-sec/dependabot/github_actions/creyD/prettier_action-4.3
Bump creyD/prettier_action from 4.2 to 4.3
2023-02-21 14:08:08 +01:00
dependabot[bot] 3a907b2921 Bump creyD/prettier_action from 4.2 to 4.3
Bumps [creyD/prettier_action](https://github.com/creyD/prettier_action) from 4.2 to 4.3.
- [Release notes](https://github.com/creyD/prettier_action/releases)
- [Commits](https://github.com/creyD/prettier_action/compare/v4.2...v4.3)

---
updated-dependencies:
- dependency-name: creyD/prettier_action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
2023-02-21 12:07:33 +00:00
dev-sec CI 3c6806057c update changelog 2023-02-15 17:02:08 +00:00
Nejc Habjan 9e4ea20c67 Only skip audit restart handler in docker (#637)
Signed-off-by: Nejc Habjan <[email protected]>
2023-02-15 17:58:52 +01:00
dev-sec CI f245030ead update changelog 2023-02-14 10:18:47 +00:00
988e5322cd Fix molecule tests for EL7 (#636)
* Fix molecule tests for EL7

Signed-off-by: Sebastian Gumprich <[email protected]>

* Apply suggestions from code review

Co-authored-by: schurzi <[email protected]>

* try to fix tests in centos 7

Signed-off-by: Sebastian Gumprich <[email protected]>

* try to fix tests in centos 7

Signed-off-by: Sebastian Gumprich <[email protected]>

---------

Signed-off-by: Sebastian Gumprich <[email protected]>
Co-authored-by: dev-sec CI <[email protected]>
Co-authored-by: schurzi <[email protected]>
2023-02-14 11:15:21 +01:00
dev-sec CI 0cd3b0d02e update changelog 2023-02-07 08:41:03 +00:00
schurzi 9b32aca0ca run our CI tests periodically (#634)
* allow multiple instances for os vm tests

Signed-off-by: Martin Schurz <[email protected]>

* add scheduled trigger to all test actions

Signed-off-by: Martin Schurz <[email protected]>

* use different scenario names

Signed-off-by: Martin Schurz <[email protected]>

* use different scenario names

Signed-off-by: Martin Schurz <[email protected]>

* use different scenario names

Signed-off-by: Martin Schurz <[email protected]>

* use username to create uniqe vms

Signed-off-by: Martin Schurz <[email protected]>

* use compatible name

Signed-off-by: Martin Schurz <[email protected]>

* add explaination

Signed-off-by: Martin Schurz <[email protected]>

---------

Signed-off-by: Martin Schurz <[email protected]>
2023-02-07 09:27:46 +01:00
dev-sec CI 8d667aa069 update changelog 2023-02-06 13:04:41 +00:00
Sebastian Gumprich c2e9c9a8dd try to fix molecule local tests (#632)
these settings are probably not necessary (geerlingguys images dont have them either)

Signed-off-by: Sebastian Gumprich <[email protected]>
2023-02-06 14:01:40 +01:00
dev-sec CI 3d9dfc90df update changelog 2023-02-06 12:53:51 +00:00
Nejc Habjan 1fc2809307 Make action_mail_acct configurable in auditd (#631)
Signed-off-by: Nejc Habjan <[email protected]>
2023-02-06 13:24:43 +01:00
dev-sec CI 071b270b94 update changelog 2023-02-06 07:40:43 +00:00
schurzi 1ef9171393 remove unneccessary tasks for VM based test (#629)
* add remaining platforms to test

Signed-off-by: Martin Schurz <[email protected]>

* remove unneccessary tasks for test

Signed-off-by: Martin Schurz <[email protected]>

* use current opensuse version

Signed-off-by: Martin Schurz <[email protected]>

* disable sysctl for missing yama in opensuse

Signed-off-by: Martin Schurz <[email protected]>

---------

Signed-off-by: Martin Schurz <[email protected]>
2023-02-06 08:37:40 +01:00
dev-sec CI a505c3039d update galaxy.yml with new version 2023-02-06 07:37:06 +00:00
dev-sec CI 965013efed update changelog 2023-02-04 17:25:00 +00:00
schurzi 0705a9cc90 Merge pull request #628 from Normo/add-password-warn-age-option
Set number of warning days before user password expires
2023-02-04 18:21:52 +01:00
Norman Ziegner c594a1fe6a os_hardening: Add test for setting password warning days via variable os_auth_pw_warn_age
Signed-off-by: Norman Ziegner <[email protected]>
2023-02-03 14:47:27 +01:00
Norman Ziegner 2f60b44cca os_hardening: Add variable to set the number of days of warning before user password expires
Signed-off-by: Norman Ziegner <[email protected]>
2023-02-01 16:17:36 +01:00
dev-sec CI 1b1b0e10f2 update changelog 2023-02-01 11:40:40 +00:00
dependabot[bot] f34f24deb7 Bump hugo19941994/delete-draft-releases from 1.0.0 to 1.0.1 (#627)
Bumps [hugo19941994/delete-draft-releases](https://github.com/hugo19941994/delete-draft-releases) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/hugo19941994/delete-draft-releases/releases)
- [Commits](https://github.com/hugo19941994/delete-draft-releases/compare/v1.0.0...v1.0.1)

---
updated-dependencies:
- dependency-name: hugo19941994/delete-draft-releases
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-01 12:37:31 +01:00
dev-sec CI 6ccdaee45d update galaxy.yml with new version 2023-01-31 06:55:37 +00:00
dev-sec CI e8d16766ad update changelog 2023-01-31 06:48:47 +00:00
schurzi e6bc422f5b Merge pull request #626 from dev-sec/dependabot_labels
do not let dependabot label our prs
2023-01-30 16:21:11 +01:00
Sebastian Gumprich bfedba6907 do not let dependabot label our prs
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-30 16:20:35 +01:00
dev-sec CI 1fe0677b0b update changelog 2023-01-30 14:59:08 +00:00
schurzi 894c6117a0 Merge pull request #625 from dev-sec/linting_roles
run linting only when files inside roles change
2023-01-30 10:48:22 +01:00
Sebastian Gumprich 330a1eb94d run linting only when files inside roles change
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-30 10:23:25 +01:00
dev-sec CI 52d08ff009 update changelog 2023-01-29 12:39:47 +00:00
dev-sec CI 01cb20d644 update changelog 2023-01-28 21:01:52 +00:00
rndmh3ro bc096e58e5 Prettified Code! 2023-01-28 20:59:35 +00:00
16e00b02db rewrite user home dir hardening (#584)
* rewrite user home dir hardening

* delete duplicate var that was missed in a merge conflict

Signed-off-by: Sebastian Gumprich <[email protected]>

* linting

Signed-off-by: Sebastian Gumprich <[email protected]>

* add tests for home rewrites

Signed-off-by: Sebastian Gumprich <[email protected]>

* Apply suggestions from code review

Co-authored-by: schurzi <[email protected]>

---------

Signed-off-by: Sebastian Gumprich <[email protected]>
Co-authored-by: donestefan <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
Co-authored-by: schurzi <[email protected]>
2023-01-28 21:59:19 +01:00
Sebastian Gumprich a75b339526 fix more linting errors
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-27 11:27:35 +01:00
dev-sec CI 9fe8ca7294 update changelog 2023-01-27 10:04:18 +00:00
89138be4ec Rewrite system account detection and hardening and create tests (#621)
* rewrite system account detection and hardening

* resolve failures created when resolving merge conflicts

Signed-off-by: Sebastian Gumprich <[email protected]>

* add tests for shell removal tasks

Signed-off-by: Sebastian Gumprich <[email protected]>

* Update molecule/os_hardening/prepare.yml

Signed-off-by: Martin Schurz <[email protected]>

* split tasks for locking and setting shell

Signed-off-by: Martin Schurz <[email protected]>

* fix some more linting

Signed-off-by: Sebastian Gumprich <[email protected]>

Signed-off-by: Sebastian Gumprich <[email protected]>
Signed-off-by: Martin Schurz <[email protected]>
Co-authored-by: donestefan <[email protected]>
Co-authored-by: schurzi <[email protected]>
2023-01-27 11:01:03 +01:00
dev-sec CI f1169749f4 update changelog 2023-01-25 22:59:48 +00:00
schurzi ee80418496 Merge pull request #618 from dev-sec/deprecate_intitramfs
deprecate rebuilding of initramfs
2023-01-25 23:56:36 +01:00
Martin Schurz 7f8e9919ee add readme
Signed-off-by: Martin Schurz <[email protected]>
2023-01-25 22:30:17 +01:00
dev-sec CI bbee0b74ec update changelog 2023-01-25 12:21:00 +00:00
schurzi 0e8533049d Merge pull request #620 from dev-sec/molecule_fixes
Fixed problems with running molecule locally with cgroup v2
2023-01-25 13:18:50 +01:00
Sebastian Gumprich a1028c7504 deprecate initramfs
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-25 13:07:37 +01:00
dev-sec CI aa555b9290 update changelog 2023-01-25 08:15:45 +00:00
mmitnyan 83a0a9242b Support for Amazon Linux 2 (#624)
Signed-off-by: Manuel Mitnyan <[email protected]>

Signed-off-by: Manuel Mitnyan <[email protected]>
2023-01-25 09:12:25 +01:00
dev-sec CI fdd0bfc72a update changelog 2023-01-24 13:27:02 +00:00
schurzi 154f862ccd Merge pull request #622 from dev-sec/stop_old_tests
cancel running tests if new commit to branch is made
2023-01-24 13:21:18 +01:00
Sebastian Gumprich db4bd32767 cancel running tests if new commit to branch is made
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-24 13:08:04 +01:00
Sebastian Gumprich 281d706660 add waiver to not test mounts
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-24 13:03:04 +01:00
dev-sec CI 85271c2375 update changelog 2023-01-24 12:01:58 +00:00
Sebastian Gumprich d386bf36d2 Revert "manage tmp dir in tests"
This reverts commit 966f2fe137.
2023-01-24 12:53:39 +01:00
Sebastian Gumprich bb588bd777 linting (#603)
* linting

Signed-off-by: Sebastian Gumprich <[email protected]>

* more linting

Signed-off-by: Sebastian Gumprich <[email protected]>

* change line length issues

Signed-off-by: Sebastian Gumprich <[email protected]>

* replace yes with true in tasks

Signed-off-by: Sebastian Gumprich <[email protected]>

* use manual line-wrapping because ansible-lint does not support it correctly.

see https://github.com/ansible/ansible-lint/issues/2522

* use manual line-wrapping because ansible-lint does not support it correctly.

see https://github.com/ansible/ansible-lint/issues/2522

Signed-off-by: Sebastian Gumprich <[email protected]>

* use manual line-wrapping because ansible-lint does not support it correctly.

see https://github.com/ansible/ansible-lint/issues/2522

Signed-off-by: Sebastian Gumprich <[email protected]>

* add exception for task

Signed-off-by: Sebastian Gumprich <[email protected]>

* remove trailing whitespace

* add back deleted params

Signed-off-by: Sebastian Gumprich <[email protected]>

* add back deleted params

Signed-off-by: Sebastian Gumprich <[email protected]>

* add back tasks

Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-24 12:40:27 +01:00
Sebastian Gumprich 966f2fe137 manage tmp dir in tests
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-24 12:36:09 +01:00
Sebastian Gumprich fa2e90c6f2 mount cgroup rw, as suse seems to need it
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-23 15:59:06 +01:00
Sebastian Gumprich ed1cb1c2a7 add cgroupns: host mode to molecule
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-23 15:59:06 +01:00
Sebastian Gumprich a0d11faa8a Fixed problems with running molecule locally with cgroup v2
Signed-off-by: Sebastian Gumprich <[email protected]>
2023-01-23 15:59:06 +01:00
dev-sec CI a94168c84f update changelog 2023-01-23 09:52:21 +00:00
674be6dc6f apply password age settings to exisiting regular users (#582)
* apply password age settings to regular users

* add tests for password ageing

Signed-off-by: Sebastian Gumprich <[email protected]>

* add debugging vars

Signed-off-by: Sebastian Gumprich <[email protected]>

* add tests for password ageing

Signed-off-by: Sebastian Gumprich <[email protected]>

* add tests for password ageing

Signed-off-by: Sebastian Gumprich <[email protected]>

* Apply suggestions from code review

Co-authored-by: schurzi <[email protected]>

* add additional condtion for regular users

Signed-off-by: Sebastian Gumprich <[email protected]>

Signed-off-by: Sebastian Gumprich <[email protected]>
Co-authored-by: DonEstefan <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
Co-authored-by: schurzi <[email protected]>
2023-01-23 10:50:05 +01:00
dev-sec CI c1080de135 update changelog 2023-01-23 08:37:51 +00:00
stdtom 9d2c68ef2f Preserve default ownership and dir mode for /var/log on Ubuntu (#615)
* Preserve default ownership and dir mode for /var/log on Ubuntu

Signed-off-by: stdtom <[email protected]>

* linting

Signed-off-by: stdtom <[email protected]>

* Define vars for each OS instead of using defaults.

Signed-off-by: stdtom <[email protected]>

* Fix values for os_mnt_var_log_dir_mode and os_mnt_var_log_group

Signed-off-by: stdtom <[email protected]>

Signed-off-by: stdtom <[email protected]>
2023-01-23 09:34:41 +01:00
153 changed files with 5515 additions and 2456 deletions

No files matched your search

+4 -5
View File
@@ -4,15 +4,14 @@
# and not relative to the CWD of execution. CLI arguments passed to the --exclude
# option will be parsed relative to the CWD of execution.
exclude_paths:
- .cache/ # implicit unless exclude_paths is defined in config
- .cache/ # implicit unless exclude_paths is defined in config
- .yamllint
- ../molecule/
- ../.github/
skip_list:
- fqcn-builtins
- name[template]
mock_roles:
- geerlingguy.git
- nginxinc.nginx
skip_list:
- var-naming[no-role-prefix]
-17
View File
@@ -1,17 +0,0 @@
---
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "pip" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
+4
View File
@@ -5,9 +5,13 @@ on: # yamllint disable-line rule:truthy
# Run CI against all pushes (direct commits, also merged PRs), Pull Requests
push:
branches: [master]
paths:
- 'roles/**'
pull_request:
# The branches below must be a subset of the branches above
branches: [master]
paths:
- 'roles/**'
jobs:
ansible-lint:
+14
View File
@@ -0,0 +1,14 @@
---
name: Codespell - Spellcheck
on: # yamllint disable-line rule:truthy
push:
branches: [master]
pull_request:
branches: [master]
jobs:
codespell:
uses: "dev-sec/.github/.github/workflows/codespell.yml@main"
with:
ignore_words_list: "chage"
+16 -10
View File
@@ -15,9 +15,19 @@ on: # yamllint disable-line rule:truthy
- 'roles/mysql_hardening/**'
- 'molecule/mysql_hardening/**'
- '.github/workflows/mysql_hardening.yml'
schedule:
- cron: '0 6 * * 0'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -35,9 +45,10 @@ jobs:
- ubuntu2204
- debian10
- debian11
- debian12
# - amazon # geerlingguy.mysql does not support fedora
# - arch # needs to be fixed
- opensuse_tumbleweed # needs to be fixed
# - arch # geerlingguy.mysql does not support arch
- opensuse_tumbleweed
# - fedora # geerlingguy.mysql does not support fedora
steps:
- name: Checkout repo
@@ -46,10 +57,10 @@ jobs:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python 3.7
- name: Set up Python 3.11
uses: actions/setup-python@v4
with:
python-version: 3.7
python-version: 3.11
- name: Install dependencies
run: |
@@ -58,11 +69,6 @@ jobs:
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -s /home/runner/work/ansible-os-hardening/ansible-os-hardening /home/runner/.ansible/collections
# that was a hard one to fix. robert did it thankfully
# https://github.com/robertdebock/ansible-role-mysql/commit/7562e99099b06282391ab7ed102b393a0406d212
- name: disable apparmor on debian systems
+15 -9
View File
@@ -14,9 +14,19 @@ on: # yamllint disable-line rule:truthy
- 'roles/nginx_hardening/**'
- 'molecule/nginx_hardening/**'
- '.github/workflows/nginx_hardening.yml'
schedule:
- cron: '0 6 * * 1'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -34,7 +44,8 @@ jobs:
- ubuntu2204
- debian10
- debian11
- amazon
- debian12
- amazon2023
# - arch # needs to be fixed
# - opensuse_tumbleweed # needs to be fixed
# - fedora # no support from geerlingguy role
@@ -45,10 +56,10 @@ jobs:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python 3.7
- name: Set up Python 3.11
uses: actions/setup-python@v4
with:
python-version: 3.7
python-version: 3.11
- name: Install dependencies
run: |
@@ -57,11 +68,6 @@ jobs:
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -s /home/runner/work/ansible-os-hardening/ansible-os-hardening /home/runner/.ansible/collections
- name: Test with molecule
run: |
molecule --version
+18 -10
View File
@@ -14,9 +14,19 @@ on: # yamllint disable-line rule:truthy
- 'roles/os_hardening/**'
- 'molecule/os_hardening/**'
- '.github/workflows/os_hardening.yml'
schedule:
- cron: '0 6 * * 3'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -29,14 +39,17 @@ jobs:
- centosstream9
- rocky8
- rocky9
- fedora37
- fedora38
- ubuntu1804
- ubuntu2004
- ubuntu2204
- debian10
- debian11
- amazon
- debian12
- amazon2023
- opensuse_tumbleweed
# - arch # needs to be fixed
- arch
steps:
- name: Checkout repo
uses: actions/checkout@v3
@@ -44,10 +57,10 @@ jobs:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python 3.7
- name: Set up Python 3.11
uses: actions/setup-python@v4
with:
python-version: 3.7
python-version: 3.11
- name: Install dependencies
run: |
@@ -56,11 +69,6 @@ jobs:
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -s /home/runner/work/ansible-os-hardening/ansible-os-hardening /home/runner/.ansible/collections
- name: Test with molecule
run: |
if [ "$MOLECULE_DISTRO" = "opensuse_tumbleweed" ]; then
+17 -9
View File
@@ -14,6 +14,16 @@ on: # yamllint disable-line rule:truthy
- 'roles/os_hardening/**'
- 'molecule/os_hardening_vm/**'
- '.github/workflows/os_hardening_vm.yml'
schedule:
- cron: '0 6 * * 2'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: self-hosted
@@ -26,16 +36,19 @@ jobs:
molecule_distro:
- centos7
- centos8s
# - centos9s # problems with vagrant
- centos9s
- rocky8
# - rocky9 # problems with vagrant
- rocky9
- fedora37
- fedora38
- ubuntu1804
- ubuntu2004
- ubuntu2204
- debian10
- debian11
# - opensuse42 # opensuse currently cannot get an ip address
# - arch # arch is currently not supported by cinc-auditor
# - debian12 # waiting for https://github.com/lavabit/robox/pull/274
- opensuse15
# - arch # needs fix for audit
steps:
- name: Checkout repo
uses: actions/checkout@v3
@@ -43,11 +56,6 @@ jobs:
path: ansible_collections/devsec/hardening
submodules: true
- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -fs /opt/actions-runner/_work/ansible-collection-hardening/ansible-collection-hardening/ansible_collections /home/runner/.ansible/collections
- name: Test with molecule
run: |
molecule --version
+1 -1
View File
@@ -21,6 +21,6 @@ jobs:
ref: ${{ github.head_ref }}
- name: Prettify code
uses: creyD/prettier_action@v4.2
uses: creyD/prettier_action@v4.3
with:
prettier_options: --write {**/*,*}.md
+1 -1
View File
@@ -63,7 +63,7 @@ jobs:
path: ./CHANGELOGRELEASE.md
- name: Delete old drafts
uses: hugo19941994/[email protected].0
uses: hugo19941994/[email protected].1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+19 -12
View File
@@ -14,9 +14,19 @@ on: # yamllint disable-line rule:truthy
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening/**'
- '.github/workflows/ssh_hardening.yml'
schedule:
- cron: '0 6 * * 5'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -29,15 +39,17 @@ jobs:
- centosstream9
- rocky8
- rocky9
- fedora
- fedora37
- fedora38
- ubuntu1804
- ubuntu2004
- ubuntu2204
- debian10
- debian11
- amazon
# - arch # needs to be fixed
# - opensuse_tumbleweed # baseline is not compatible with suse
- 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
@@ -45,10 +57,10 @@ jobs:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python 3.7
- name: Set up Python 3.11
uses: actions/setup-python@v4
with:
python-version: 3.7
python-version: 3.11
- name: Install dependencies
run: |
@@ -57,11 +69,6 @@ jobs:
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -s /home/runner/work/ansible-os-hardening/ansible-os-hardening /home/runner/.ansible/collections
- name: Test with molecule
run: |
if [ "$MOLECULE_DISTRO" = "opensuse_tumbleweed" ]; then
+52
View File
@@ -0,0 +1,52 @@
---
name: "devsec.ssh_hardening BSD"
on: # yamllint disable-line rule:truthy
workflow_dispatch:
push:
branches: [master]
paths:
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_bsd/**'
- '.github/workflows/ssh_hardening_bsd.yml'
pull_request:
branches: [master]
paths:
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_bsd/**'
- '.github/workflows/ssh_hardening_bsd.yml'
schedule:
- cron: '0 6 * * 5'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: self-hosted
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
strategy:
fail-fast: false
matrix:
molecule_distro:
- openbsd7
- freebsd12
steps:
- name: Checkout repo
uses: actions/checkout@v3
with:
path: ansible_collections/devsec/hardening
submodules: true
- name: Test with molecule
run: |
molecule --version
molecule test -s ssh_hardening_bsd
env:
MOLECULE_DISTRO: ${{ matrix.molecule_distro }}
working-directory: ansible_collections/devsec/hardening
@@ -14,9 +14,19 @@ on: # yamllint disable-line rule:truthy
- 'roles/ssh_hardening/**'
- 'molecule/ssh_hardening_custom_tests/**'
- '.github/workflows/ssh_hardening_custom_tests.yml'
schedule:
- cron: '0 6 * * 4'
concurrency:
group: >-
${{ github.workflow }}-${{
github.event.pull_request.number || github.sha
}}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
env:
PY_COLORS: 1
ANSIBLE_FORCE_COLOR: 1
@@ -29,15 +39,17 @@ jobs:
- centosstream9
- rocky8
- rocky9
- fedora
- fedora37
- fedora38
- ubuntu1804
- ubuntu2004
- ubuntu2204
- debian10
- debian11
- amazon
# - arch # needs to be fixed
# - opensuse_tumbleweed # baseline is not compatible with suse
- 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
@@ -45,10 +57,10 @@ jobs:
path: ansible_collections/devsec/hardening
submodules: true
- name: Set up Python 3.7
- name: Set up Python 3.11
uses: actions/setup-python@v4
with:
python-version: 3.7
python-version: 3.11
- name: Install dependencies
run: |
@@ -57,11 +69,6 @@ jobs:
pip install -r requirements.txt
working-directory: ansible_collections/devsec/hardening
- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -s /home/runner/work/ansible-os-hardening/ansible-os-hardening /home/runner/.ansible/collections
- name: Test with molecule
run: |
if [ "$MOLECULE_DISTRO" = "opensuse_tumbleweed" ]; then
-26
View File
@@ -1,26 +0,0 @@
---
# Based on ansible-lint config
extends: default
rules:
braces:
max-spaces-inside: 1
level: error
brackets:
max-spaces-inside: 1
level: error
colons:
max-spaces-after: -1
level: error
commas:
max-spaces-after: -1
level: error
empty-lines:
max: 3
level: error
hyphens:
level: error
key-duplicates: enable
line-length: disable
new-lines:
type: unix
+129 -9
View File
@@ -1,19 +1,139 @@
# Changelog
## [9.0.0](https://github.com/dev-sec/ansible-collection-hardening/tree/9.0.0) (2023-01-19)
## [8.9.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.9.0) (2023-08-07)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.4.0...9.0.0)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.8.0...8.9.0)
**Breaking changes:**
- 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))
## [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:**
- How does one set `sshd_authenticationmethods` to include password authentication? [\#686](https://github.com/dev-sec/ansible-collection-hardening/issues/686)
- Error: No file was found when using first\_found on Ubuntu 20.04 [\#676](https://github.com/dev-sec/ansible-collection-hardening/issues/676)
- 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)
- Unsupported parameters for \(ansible.builtin.user\) module [\#650](https://github.com/dev-sec/ansible-collection-hardening/issues/650)
**Merged pull requests:**
- setting gets ignored [\#680](https://github.com/dev-sec/ansible-collection-hardening/pull/680) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- add var-naming\[no-role-prefix\] to skip-list [\#679](https://github.com/dev-sec/ansible-collection-hardening/pull/679) ([rndmh3ro](https://github.com/rndmh3ro))
- expand on check conditions for non-file locations of logs [\#674](https://github.com/dev-sec/ansible-collection-hardening/pull/674) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] ([whysthatso](https://github.com/whysthatso))
- use new molecule-plugins [\#667](https://github.com/dev-sec/ansible-collection-hardening/pull/667) ([schurzi](https://github.com/schurzi))
- add spellchecking with codespell [\#662](https://github.com/dev-sec/ansible-collection-hardening/pull/662) [[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)] ([schurzi](https://github.com/schurzi))
## [8.7.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.7.0) (2023-04-12)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.6.0...8.7.0)
**Implemented enhancements:**
- Support BSD and other operating systems CI with VM based tests [\#599](https://github.com/dev-sec/ansible-collection-hardening/issues/599)
- add check mode to molecule tests [\#644](https://github.com/dev-sec/ansible-collection-hardening/pull/644) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- add testing for OpenBSD and FreeBSD [\#642](https://github.com/dev-sec/ansible-collection-hardening/pull/642) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
- Only skip audit restart handler in docker [\#637](https://github.com/dev-sec/ansible-collection-hardening/pull/637) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([nejch](https://github.com/nejch))
- Make action\_mail\_acct configurable in auditd [\#631](https://github.com/dev-sec/ansible-collection-hardening/pull/631) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([nejch](https://github.com/nejch))
**Fixed bugs:**
- getent task is skipped if user previously ran it with a key parameter [\#646](https://github.com/dev-sec/ansible-collection-hardening/issues/646)
- Error running devsec.hardening.os\_hardening role [\#645](https://github.com/dev-sec/ansible-collection-hardening/issues/645)
- devsec.hardening.mysql\_hardening - Get all users that have no authentication\_string - Hello world [\#640](https://github.com/dev-sec/ansible-collection-hardening/issues/640)
- fixes \#646 - add another condition to getent task [\#647](https://github.com/dev-sec/ansible-collection-hardening/pull/647) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([gbolo](https://github.com/gbolo))
**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)
**Merged pull requests:**
- Update minimum required Ansible version for os\_hardening [\#657](https://github.com/dev-sec/ansible-collection-hardening/pull/657) [[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))
- Update test environment [\#656](https://github.com/dev-sec/ansible-collection-hardening/pull/656) [[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))
- Update dependency geerlingguy.git to v3.0.1 [\#654](https://github.com/dev-sec/ansible-collection-hardening/pull/654) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] ([renovate[bot]](https://github.com/apps/renovate))
- Configure Renovate [\#653](https://github.com/dev-sec/ansible-collection-hardening/pull/653) ([renovate[bot]](https://github.com/apps/renovate))
- simplify MySQL queries for user deletion [\#641](https://github.com/dev-sec/ansible-collection-hardening/pull/641) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] ([schurzi](https://github.com/schurzi))
- Bump creyD/prettier\_action from 4.2 to 4.3 [\#639](https://github.com/dev-sec/ansible-collection-hardening/pull/639) ([dependabot[bot]](https://github.com/apps/dependabot))
- Fix molecule tests for EL7 [\#636](https://github.com/dev-sec/ansible-collection-hardening/pull/636) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- run our CI tests periodically [\#634](https://github.com/dev-sec/ansible-collection-hardening/pull/634) [[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))
- try to fix molecule local tests [\#632](https://github.com/dev-sec/ansible-collection-hardening/pull/632) [[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))
- remove unnecessary tasks for VM based test [\#629](https://github.com/dev-sec/ansible-collection-hardening/pull/629) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([schurzi](https://github.com/schurzi))
## [8.6.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.6.0) (2023-02-04)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.5.0...8.6.0)
**Implemented enhancements:**
- make number of warning days before user password expires configurable [\#628](https://github.com/dev-sec/ansible-collection-hardening/pull/628) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([Normo](https://github.com/Normo))
**Merged pull requests:**
- Bump hugo19941994/delete-draft-releases from 1.0.0 to 1.0.1 [\#627](https://github.com/dev-sec/ansible-collection-hardening/pull/627) ([dependabot[bot]](https://github.com/apps/dependabot))
## [8.5.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.5.0) (2023-01-30)
[Full Changelog](https://github.com/dev-sec/ansible-collection-hardening/compare/8.4.0...8.5.0)
**Implemented enhancements:**
- Add support for /etc/auditd.conf num\_logs to go with max\_log\_file\_action [\#616](https://github.com/dev-sec/ansible-collection-hardening/issues/616)
- password ageing not enforced [\#570](https://github.com/dev-sec/ansible-collection-hardening/issues/570)
- Rewrite system account detection and hardening and create tests [\#621](https://github.com/dev-sec/ansible-collection-hardening/pull/621) [[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))
- Add support for /etc/auditd.conf num\_logs to go with max\_log\_file\_action [\#617](https://github.com/dev-sec/ansible-collection-hardening/pull/617) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([richardlock](https://github.com/richardlock))
- Preserve default ownership and dir mode for /var/log on Ubuntu [\#615](https://github.com/dev-sec/ansible-collection-hardening/pull/615) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([stdtom](https://github.com/stdtom))
- rewrite user home dir hardening [\#584](https://github.com/dev-sec/ansible-collection-hardening/pull/584) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([DonEstefan](https://github.com/DonEstefan))
- apply password age settings to existing regular users [\#582](https://github.com/dev-sec/ansible-collection-hardening/pull/582) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([DonEstefan](https://github.com/DonEstefan))
- Parametrize more auditd.conf options [\#535](https://github.com/dev-sec/ansible-collection-hardening/pull/535) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([kravietz](https://github.com/kravietz))
**Fixed bugs:**
- os\_hardening is setting wrong ownership for /var/log on Ubuntu [\#614](https://github.com/dev-sec/ansible-collection-hardening/issues/614)
- \[os\_hardening\] Task for setting `initramfs` modules does not match its condition [\#590](https://github.com/dev-sec/ansible-collection-hardening/issues/590) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)]
- Support for Amazon Linux 2 [\#624](https://github.com/dev-sec/ansible-collection-hardening/pull/624) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([mmitnyan](https://github.com/mmitnyan))
**Deprecated:**
- deprecate rebuilding of initramfs [\#618](https://github.com/dev-sec/ansible-collection-hardening/pull/618) [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
**Closed issues:**
- Ubuntu 22.04 vars file missing? [\#619](https://github.com/dev-sec/ansible-collection-hardening/issues/619)
- SSH KexAlgorithms causes SSH daemon to fail [\#500](https://github.com/dev-sec/ansible-collection-hardening/issues/500)
- Playbook won't run for hardening [\#462](https://github.com/dev-sec/ansible-collection-hardening/issues/462)
**Merged pull requests:**
- do not let dependabot label our prs [\#626](https://github.com/dev-sec/ansible-collection-hardening/pull/626) ([rndmh3ro](https://github.com/rndmh3ro))
- run linting only when files inside roles change [\#625](https://github.com/dev-sec/ansible-collection-hardening/pull/625) ([rndmh3ro](https://github.com/rndmh3ro))
- cancel running tests if new commit to branch is made [\#622](https://github.com/dev-sec/ansible-collection-hardening/pull/622) [[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))
- Fixed problems with running molecule locally with cgroup v2 [\#620](https://github.com/dev-sec/ansible-collection-hardening/pull/620) [[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))
- Bump actions/setup-python from 1 to 4 [\#611](https://github.com/dev-sec/ansible-collection-hardening/pull/611) [[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)] ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump creyD/prettier\_action from 3.1 to 4.2 [\#610](https://github.com/dev-sec/ansible-collection-hardening/pull/610) ([dependabot[bot]](https://github.com/apps/dependabot))
- linting [\#603](https://github.com/dev-sec/ansible-collection-hardening/pull/603) [[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))
## [8.4.0](https://github.com/dev-sec/ansible-collection-hardening/tree/8.4.0) (2022-12-17)
@@ -121,7 +241,7 @@
**Implemented enhancements:**
- revert debian 9 change, only one tls variable now [\#562](https://github.com/dev-sec/ansible-collection-hardening/pull/562) [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([rndmh3ro](https://github.com/rndmh3ro))
- add posibility to run ssh\_hardening as unprivileged user [\#561](https://github.com/dev-sec/ansible-collection-hardening/pull/561) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
- add possibility to run ssh\_hardening as unprivileged user [\#561](https://github.com/dev-sec/ansible-collection-hardening/pull/561) [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] ([schurzi](https://github.com/schurzi))
- add basic support for ubuntu22.04 [\#554](https://github.com/dev-sec/ansible-collection-hardening/pull/554) [[mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/mysql_hardening)] [[os_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/os_hardening)] [[ssh_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/ssh_hardening)] [[nginx_hardening](https://github.com/dev-sec/ansible-collection-hardening/labels/nginx_hardening)] ([schurzi](https://github.com/schurzi))
- Add full support for Debian 11 [\#538](https://github.com/dev-sec/ansible-collection-hardening/pull/538) [[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)] ([addianto](https://github.com/addianto))
@@ -192,7 +312,7 @@
**Closed issues:**
- No such file directory error triggered by the kernel.unpriviliged\_userns\_clone configuration. [\#514](https://github.com/dev-sec/ansible-collection-hardening/issues/514)
- No such file directory error triggered by the kernel.unprivileged\_userns\_clone configuration. [\#514](https://github.com/dev-sec/ansible-collection-hardening/issues/514)
**Merged pull requests:**
@@ -631,7 +751,7 @@
- Add kernel parameter information to README [\#259](https://github.com/dev-sec/ansible-collection-hardening/pull/259) ([jaredledvina](https://github.com/jaredledvina))
- Remove trailing whitespaces \(ansible-lint 201\) [\#254](https://github.com/dev-sec/ansible-collection-hardening/pull/254) ([kravietz](https://github.com/kravietz))
- Standardize the var ordering [\#251](https://github.com/dev-sec/ansible-collection-hardening/pull/251) ([dustinmiller](https://github.com/dustinmiller))
- Add intial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-collection-hardening/pull/250) ([dustinmiller](https://github.com/dustinmiller))
- Add initial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-collection-hardening/pull/250) ([dustinmiller](https://github.com/dustinmiller))
- Make max\_log\_file\_action for auditd configurable [\#246](https://github.com/dev-sec/ansible-collection-hardening/pull/246) ([jandd](https://github.com/jandd))
- Add exception in sysctl task [\#240](https://github.com/dev-sec/ansible-collection-hardening/pull/240) ([ghost](https://github.com/ghost))
- Fedora - Use new auto ansible\_python\_interpreter for dnf [\#239](https://github.com/dev-sec/ansible-collection-hardening/pull/239) ([jaredledvina](https://github.com/jaredledvina))
@@ -682,7 +802,7 @@
- Docker [\#90](https://github.com/dev-sec/ansible-collection-hardening/pull/90) ([rndmh3ro](https://github.com/rndmh3ro))
- debian 8 support [\#88](https://github.com/dev-sec/ansible-collection-hardening/pull/88) ([rndmh3ro](https://github.com/rndmh3ro))
- Ufw manage defaults [\#85](https://github.com/dev-sec/ansible-collection-hardening/pull/85) ([fitz123](https://github.com/fitz123))
- replace ignore\_errors to failed\_when to supress ugly error warnings [\#81](https://github.com/dev-sec/ansible-collection-hardening/pull/81) ([fitz123](https://github.com/fitz123))
- replace ignore\_errors to failed\_when to suppress ugly error warnings [\#81](https://github.com/dev-sec/ansible-collection-hardening/pull/81) ([fitz123](https://github.com/fitz123))
- fix bare variables usage for loops [\#79](https://github.com/dev-sec/ansible-collection-hardening/pull/79) ([fitz123](https://github.com/fitz123))
- update platforms in meta-file [\#69](https://github.com/dev-sec/ansible-collection-hardening/pull/69) ([rndmh3ro](https://github.com/rndmh3ro))
- add webhook for ansible galaxy [\#68](https://github.com/dev-sec/ansible-collection-hardening/pull/68) ([rndmh3ro](https://github.com/rndmh3ro))
@@ -708,7 +828,7 @@
- \[lots of\] deprecation warnings in Ansible 2.8 [\#221](https://github.com/dev-sec/ansible-collection-hardening/issues/221)
- `squash_actions` deprecation warning [\#218](https://github.com/dev-sec/ansible-collection-hardening/issues/218)
- login.defs.j2 template: ENV\_PATH is missing ':' before variable substitution [\#202](https://github.com/dev-sec/ansible-collection-hardening/issues/202)
- auditd causing v5.0 to fail on unpriviledged LXC's [\#191](https://github.com/dev-sec/ansible-collection-hardening/issues/191)
- auditd causing v5.0 to fail on unprivileged LXC's [\#191](https://github.com/dev-sec/ansible-collection-hardening/issues/191)
- Setting os\_security\_users\_allow has no effect [\#175](https://github.com/dev-sec/ansible-collection-hardening/issues/175)
- minimize\_access: maximum recursion depth exceeded on Ansible 2.5 [\#171](https://github.com/dev-sec/ansible-collection-hardening/issues/171)
- wrong permissions passwdqc [\#170](https://github.com/dev-sec/ansible-collection-hardening/issues/170)
@@ -796,7 +916,7 @@
- adjust permissions on shadow file on suse [\#311](https://github.com/dev-sec/ansible-collection-hardening/pull/311) ([rndmh3ro](https://github.com/rndmh3ro))
- fix fedora build [\#296](https://github.com/dev-sec/ansible-collection-hardening/pull/296) ([rndmh3ro](https://github.com/rndmh3ro))
- do not blacklist used filesystems [\#289](https://github.com/dev-sec/ansible-collection-hardening/pull/289) ([schurzi](https://github.com/schurzi))
- move hidepid vars into defaults so theyre overwritable [\#285](https://github.com/dev-sec/ansible-collection-hardening/pull/285) ([rndmh3ro](https://github.com/rndmh3ro))
- move hidepid vars into defaults so they're overwritable [\#285](https://github.com/dev-sec/ansible-collection-hardening/pull/285) ([rndmh3ro](https://github.com/rndmh3ro))
- install procps in debian so sysctl.conf exists [\#282](https://github.com/dev-sec/ansible-collection-hardening/pull/282) ([rndmh3ro](https://github.com/rndmh3ro))
- move defaults to os-specific vars [\#157](https://github.com/dev-sec/ansible-collection-hardening/pull/157) ([rndmh3ro](https://github.com/rndmh3ro))
- Converts set to JSON-serializable list [\#126](https://github.com/dev-sec/ansible-collection-hardening/pull/126) ([pestaa](https://github.com/pestaa))
@@ -848,7 +968,7 @@
- Repair debian install script [\#8](https://github.com/dev-sec/ansible-collection-hardening/pull/8) ([rndmh3ro](https://github.com/rndmh3ro))
- Separate tasks into multiple smaller files [\#7](https://github.com/dev-sec/ansible-collection-hardening/pull/7) ([rndmh3ro](https://github.com/rndmh3ro))
- Enable gpg-check on all yum-repositories [\#5](https://github.com/dev-sec/ansible-collection-hardening/pull/5) ([rndmh3ro](https://github.com/rndmh3ro))
- Change playbook-path to accomodate test-repo [\#4](https://github.com/dev-sec/ansible-collection-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))
- Change playbook-path to accommodate test-repo [\#4](https://github.com/dev-sec/ansible-collection-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))
- treat securetty config as an array [\#3](https://github.com/dev-sec/ansible-collection-hardening/pull/3) ([arlimus](https://github.com/arlimus))
- Add Securetty-support [\#2](https://github.com/dev-sec/ansible-collection-hardening/pull/2) ([rndmh3ro](https://github.com/rndmh3ro))
- Add profile.conf configuration [\#1](https://github.com/dev-sec/ansible-collection-hardening/pull/1) ([rndmh3ro](https://github.com/rndmh3ro))
+5 -5
View File
@@ -26,7 +26,7 @@
- fix fedora build [\#296](https://github.com/dev-sec/ansible-os-hardening/pull/296) ([rndmh3ro](https://github.com/rndmh3ro))
- do not blacklist used filesystems [\#289](https://github.com/dev-sec/ansible-os-hardening/pull/289) [[patch](https://github.com/dev-sec/ansible-os-hardening/labels/patch)] ([schurzi](https://github.com/schurzi))
- move hidepid vars into defaults so theyre overwritable [\#285](https://github.com/dev-sec/ansible-os-hardening/pull/285) [[patch](https://github.com/dev-sec/ansible-os-hardening/labels/patch)] ([rndmh3ro](https://github.com/rndmh3ro))
- move hidepid vars into defaults so they're overwritable [\#285](https://github.com/dev-sec/ansible-os-hardening/pull/285) [[patch](https://github.com/dev-sec/ansible-os-hardening/labels/patch)] ([rndmh3ro](https://github.com/rndmh3ro))
## [6.1.0](https://github.com/dev-sec/ansible-os-hardening/tree/6.1.0) (2020-07-21)
@@ -90,7 +90,7 @@
- Add kernel parameter information to README [\#259](https://github.com/dev-sec/ansible-os-hardening/pull/259) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([jaredledvina](https://github.com/jaredledvina))
- Remove trailing whitespaces \(ansible-lint 201\) [\#254](https://github.com/dev-sec/ansible-os-hardening/pull/254) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([kravietz](https://github.com/kravietz))
- Standardize the var ordering [\#251](https://github.com/dev-sec/ansible-os-hardening/pull/251) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([dustinmiller1337](https://github.com/dustinmiller1337))
- Add intial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-os-hardening/pull/250) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([dustinmiller1337](https://github.com/dustinmiller1337))
- Add initial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-os-hardening/pull/250) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([dustinmiller1337](https://github.com/dustinmiller1337))
- Make max_log_file_action for auditd configurable [\#246](https://github.com/dev-sec/ansible-os-hardening/pull/246) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([jandd](https://github.com/jandd))
- Add exception in sysctl task [\#240](https://github.com/dev-sec/ansible-os-hardening/pull/240) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([ghost](https://github.com/ghost))
- Fedora - Use new auto ansible_python_interpreter for dnf [\#239](https://github.com/dev-sec/ansible-os-hardening/pull/239) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([jaredledvina](https://github.com/jaredledvina))
@@ -165,7 +165,7 @@
**Fixed bugs:**
- auditd causing v5.0 to fail on unpriviledged LXC's [\#191](https://github.com/dev-sec/ansible-os-hardening/issues/191) [[bug](https://github.com/dev-sec/ansible-os-hardening/labels/bug)]
- auditd causing v5.0 to fail on unprivileged LXC's [\#191](https://github.com/dev-sec/ansible-os-hardening/issues/191) [[bug](https://github.com/dev-sec/ansible-os-hardening/labels/bug)]
- Setting os_security_users_allow has no effect [\#175](https://github.com/dev-sec/ansible-os-hardening/issues/175) [[bug](https://github.com/dev-sec/ansible-os-hardening/labels/bug)]
- add /usr/bin/su to suid_guid whitelist [\#199](https://github.com/dev-sec/ansible-os-hardening/pull/199) [[bug](https://github.com/dev-sec/ansible-os-hardening/labels/bug)] ([ccolic](https://github.com/ccolic))
- ensure that permissions to su-binary are not restricted to root user and group only, if os_security_users_allow contains the value change_user [\#197](https://github.com/dev-sec/ansible-os-hardening/pull/197) [[bug](https://github.com/dev-sec/ansible-os-hardening/labels/bug)] ([szEvEz](https://github.com/szEvEz))
@@ -346,7 +346,7 @@
- Docker [\#90](https://github.com/dev-sec/ansible-os-hardening/pull/90) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([rndmh3ro](https://github.com/rndmh3ro))
- debian 8 support [\#88](https://github.com/dev-sec/ansible-os-hardening/pull/88) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([rndmh3ro](https://github.com/rndmh3ro))
- Ufw manage defaults [\#85](https://github.com/dev-sec/ansible-os-hardening/pull/85) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([fitz123](https://github.com/fitz123))
- replace ignore_errors to failed_when to supress ugly error warnings [\#81](https://github.com/dev-sec/ansible-os-hardening/pull/81) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([fitz123](https://github.com/fitz123))
- replace ignore_errors to failed_when to suppress ugly error warnings [\#81](https://github.com/dev-sec/ansible-os-hardening/pull/81) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([fitz123](https://github.com/fitz123))
- fix bare variables usage for loops [\#79](https://github.com/dev-sec/ansible-os-hardening/pull/79) [[enhancement](https://github.com/dev-sec/ansible-os-hardening/labels/enhancement)] ([fitz123](https://github.com/fitz123))
**Fixed bugs:**
@@ -459,7 +459,7 @@
- Repair debian install script [\#8](https://github.com/dev-sec/ansible-os-hardening/pull/8) ([rndmh3ro](https://github.com/rndmh3ro))
- Separate tasks into multiple smaller files [\#7](https://github.com/dev-sec/ansible-os-hardening/pull/7) ([rndmh3ro](https://github.com/rndmh3ro))
- Enable gpg-check on all yum-repositories [\#5](https://github.com/dev-sec/ansible-os-hardening/pull/5) ([rndmh3ro](https://github.com/rndmh3ro))
- Change playbook-path to accomodate test-repo [\#4](https://github.com/dev-sec/ansible-os-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))
- Change playbook-path to accommodate test-repo [\#4](https://github.com/dev-sec/ansible-os-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))
- treat securetty config as an array [\#3](https://github.com/dev-sec/ansible-os-hardening/pull/3) ([arlimus](https://github.com/arlimus))
- Add Securetty-support [\#2](https://github.com/dev-sec/ansible-os-hardening/pull/2) ([rndmh3ro](https://github.com/rndmh3ro))
- Add profile.conf configuration [\#1](https://github.com/dev-sec/ansible-os-hardening/pull/1) ([rndmh3ro](https://github.com/rndmh3ro))
+4 -4
View File
@@ -11,13 +11,13 @@
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)
- Fedora (some roles supported)
- Fedora 37/38 (some roles supported)
- Suse Tumbleweed (some roles supported)
- MySQL
- MariaDB >= 5.5.65, >= 10.1.45, >= 10.3.17
+2 -1
View File
@@ -1,6 +1,6 @@
namespace: devsec
name: hardening
version: 8.4.0
version: 8.8.0
readme: README.md
authors:
- dev-sec <[email protected]>
@@ -42,3 +42,4 @@ build_ignore:
- .tox
- tox.ini
- .yamllint
- renovate.json
+1 -1
View File
@@ -1,2 +1,2 @@
---
requires_ansible: '>=2.9.10'
requires_ansible: ">=2.9.10"
+6 -13
View File
@@ -8,21 +8,13 @@ driver:
name: docker
platforms:
- name: instance
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
image: "ghcr.io/dev-sec/docker-${MOLECULE_DISTRO}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /sys/fs/cgroup:/sys/fs/cgroup:rw
privileged: true
cgroupns_mode: host
pre_build_image: true
environment:
container: docker
security_opts:
- apparmor=unconfined
env:
http_proxy: "${http_proxy}"
https_proxy: "${https_proxy}"
no_proxy: "${no_proxy}"
container: docker
provisioner:
name: ansible
options:
@@ -30,7 +22,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callback_whitelist: profile_tasks, timer, yaml
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -60,7 +52,8 @@ scenario:
- syntax
- create
- prepare
- check
- converge
# - idempotence # not idempotent
- idempotence
- verify
- destroy
+9 -5
View File
@@ -60,14 +60,18 @@
- 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: create a user with an empty password
community.mysql.mysql_query:
query:
- "CREATE USER foo@bar;"
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
- name: include MySQL user prepare tasks
include_tasks: prepare_tasks/mysql_users.yml
vars:
overwrite_global_mycnf: false
mysql_root_password: iloverandompasswordsbutthiswilldo
@@ -0,0 +1,15 @@
---
- 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';"
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
@@ -1,7 +1,5 @@
---
roles:
- name: geerlingguy.git
version: 3.0.0
- name: dev-sec.mysql
version: master
+21 -28
View File
@@ -6,26 +6,12 @@
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
roles:
- geerlingguy.git
tasks:
- name: install fake SuSE-release for cinc compatibility
copy:
content: |
openSUSE Faked Enterprise 2020 (x86_64)
VERSION = 2020
CODENAME = Faked Feature
dest: /etc/SuSE-release
owner: root
group: root
mode: '0444'
when: ansible_facts.os_family == 'Suse'
- name: install git for SuSE since geerlinguy.git does not support it
zypper:
name: git
state: present
when: ansible_facts.os_family == 'Suse'
- name: Use Python 3 on Suse
set_fact:
ansible_python_interpreter: /usr/bin/python3
when:
- ansible_os_family == 'Suse'
- name: install procps for debian systems
apt:
@@ -37,17 +23,24 @@
- name: include tests for the service
include_tasks: verify_tasks/service.yml
- name: download cinc-auditor
get_url:
url: https://omnitruck.cinc.sh/install.sh
dest: /tmp/install.sh
mode: '0775'
- name: install cinc-auditor
shell: "bash /tmp/install.sh -s -- -P cinc-auditor -v 4"
- name: include tests for MySQL user
include_tasks: verify_tasks/mysql_users.yml
- name: Verify
hosts: localhost
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: Execute cinc-auditor tests
command: "/opt/cinc-auditor/bin/cinc-auditor exec --no-show-progress --no-color --no-distinct-exit https://github.com/dev-sec/mysql-baseline/archive/refs/heads/master.zip"
command: >
docker run
--volume /run/docker.sock:/run/docker.sock
docker.io/cincproject/auditor exec
-t docker://instance
--no-show-progress --no-color
--no-distinct-exit https://github.com/dev-sec/mysql-baseline/archive/refs/heads/master.zip
register: test_results
changed_when: false
ignore_errors: true
@@ -0,0 +1,25 @@
---
- name: Get all users from MySQL server
community.mysql.mysql_query:
query: >
SELECT CONCAT(USER, '@', HOST) AS users FROM mysql.user;
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
register: mysql_users
- name: create list of users from mysql query
set_fact:
mysql_users_list: "{{ mysql_users.query_result.0 | json_query('[*].users') | list }}"
- name: assert that only accounts with password remain
ansible.builtin.assert:
that:
- '"user@delete" not in mysql_users_list'
- '"[email protected]" not in mysql_users_list'
- '"user@::1" not in mysql_users_list'
- '"user@%" not in mysql_users_list'
- '"[email protected].%" not in mysql_users_list'
- '"[email protected]" not in mysql_users_list'
- '"%@192.168.0.1" not in mysql_users_list'
- '"[email protected]" in mysql_users_list'
- '"user@keep" in mysql_users_list'
- '"[email protected].%" in mysql_users_list'
+2
View File
@@ -2,6 +2,8 @@
- 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) }}"
+6 -14
View File
@@ -7,22 +7,13 @@ driver:
name: docker
platforms:
- name: instance
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
image: "ghcr.io/dev-sec/docker-${MOLECULE_DISTRO}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /sys/fs/cgroup:/sys/fs/cgroup:rw
privileged: true
tmpfs:
- /tmp
- /run
capabilities:
- SYS_ADMIN
tty: true
env:
http_proxy: "${http_proxy}"
https_proxy: "${https_proxy}"
no_proxy: "${no_proxy}"
container: docker
cgroupns_mode: host
pre_build_image: true
provisioner:
name: ansible
options:
@@ -30,7 +21,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callback_whitelist: profile_tasks, timer, yaml
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -60,6 +51,7 @@ scenario:
- syntax
- create
- prepare
- check
- converge
- idempotence
- verify
@@ -1,4 +1,3 @@
---
roles:
- geerlingguy.git
- geerlingguy.nginx
+18 -37
View File
@@ -6,48 +6,29 @@
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
roles:
- geerlingguy.git
tasks:
- name: install fake SuSE-release for cinc compatibility
copy:
content: |
openSUSE Faked Enterprise 2020 (x86_64)
VERSION = 2020
CODENAME = Faked Feature
dest: /etc/SuSE-release
owner: root
group: root
mode: '0444'
when: ansible_facts.os_family == 'Suse'
- name: install git for SuSE since geerlinguy.git does not support it
zypper:
name: git
state: present
when: ansible_facts.os_family == 'Suse'
- name: Run the equivalent of "apt-get update" as a separate step
apt:
update_cache: true
when: ansible_facts.os_family == 'Debian'
- name: install required tools on debian
- name: install procps for debian systems
apt:
name: procps
when: ansible_facts.os_family == 'Debian'
- name: download cinc-auditor
get_url:
url: https://omnitruck.cinc.sh/install.sh
dest: /tmp/install.sh
mode: '0775'
- name: install cinc-auditor
shell: "bash /tmp/install.sh -s -- -P cinc-auditor -v 4"
state: present
update_cache: true
when: ansible_distribution == 'Debian'
- name: Verify
hosts: localhost
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: Execute cinc-auditor tests
command: "/opt/cinc-auditor/bin/cinc-auditor exec --no-show-progress --no-color --no-distinct-exit https://github.com/dev-sec/nginx-baseline/archive/refs/heads/master.zip"
command: >
docker run
--volume /run/docker.sock:/run/docker.sock
docker.io/cincproject/auditor exec
-t docker://instance
--no-show-progress --no-color
--no-distinct-exit https://github.com/dev-sec/nginx-baseline/archive/refs/heads/master.zip
register: test_results
changed_when: false
ignore_errors: true
+4
View File
@@ -28,7 +28,11 @@
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_auth_pw_warn_age: 7
os_netrc_enabled: false
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
+6 -18
View File
@@ -1,28 +1,15 @@
---
dependency:
name: galaxy
options:
role-file: molecule/os_hardening/requirements.yml
driver:
name: docker
platforms:
- name: instance
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
image: "ghcr.io/dev-sec/docker-${MOLECULE_DISTRO}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /sys/fs/cgroup:/sys/fs/cgroup:rw
privileged: true
tmpfs:
- /tmp
- /run
capabilities:
- SYS_ADMIN
tty: true
env:
http_proxy: "${http_proxy}"
https_proxy: "${https_proxy}"
no_proxy: "${no_proxy}"
container: docker
cgroupns_mode: host
pre_build_image: true
provisioner:
name: ansible
options:
@@ -30,7 +17,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callback_whitelist: profile_tasks, timer, yaml
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -60,6 +47,7 @@ scenario:
- syntax
- create
- prepare
- check
- converge
- idempotence
- verify
+28 -26
View File
@@ -1,40 +1,37 @@
---
- 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
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: set ansible_python_interpreter to "/usr/bin/python3" on fedora
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
- name: Install Python3 on Debian 10
ansible.builtin.apt:
name: python3
state: present
update_cache: true
when: ansible_os_family == 'Debian'
- name: install required tools on SuSE
- name: Set ansible_python_interpreter to "/usr/bin/python3"
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python3
- name: Install required tools on SuSE
# cannot use zypper module, since it depends on python-xml
shell: "zypper -n install python-xml"
ansible.builtin.shell: zypper -n install python-xml
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
@@ -42,8 +39,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
@@ -51,14 +48,19 @@
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 YUM prepare tasks
include_tasks: prepare_tasks/netrc.yml
- name: Include preparation tasks
ansible.builtin.include_tasks:
file: "{{ item }}"
loop:
- prepare_tasks/netrc.yml
- prepare_tasks/pw_ageing.yml
- prepare_tasks/sys_account_shell.yml
- prepare_tasks/ignore_home_folders.yml
@@ -0,0 +1,9 @@
---
- name: Create user whose home-folder should not be touched
ansible.builtin.user:
name: "user_with_777_home"
- name: Change mode of home-folder for user to 777
ansible.builtin.file:
path: /home/user_with_777_home
mode: "0777"
@@ -0,0 +1,9 @@
- name: Create user those password ageing should not be changed
user:
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"
@@ -0,0 +1,5 @@
---
- name: Create system user with shell that should keep it
user:
name: "shell_sys_acc"
shell: "/bin/bash"
-3
View File
@@ -1,3 +0,0 @@
---
roles:
- geerlingguy.git
+52 -56
View File
@@ -6,82 +6,78 @@
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
roles:
- geerlingguy.git
tasks:
- name: install fake SuSE-release for cinc compatibility
copy:
content: |
openSUSE Faked Enterprise 2020 (x86_64)
VERSION = 2020
CODENAME = Faked Feature
dest: /etc/SuSE-release
owner: root
group: root
mode: '0444'
when: ansible_facts.os_family == 'Suse'
- name: Set ansible_python_interpreter to "/usr/bin/python3"
ansible.builtin.set_fact:
ansible_python_interpreter: /usr/bin/python3
- name: install git for SuSE since geerlinguy.git does not support it
zypper:
name: git
state: present
when: ansible_facts.os_family == 'Suse'
- name: Include verification tasks
ansible.builtin.include_tasks:
file: "{{ item }}"
loop:
- verify_tasks/sys_account_shell.yml
- verify_tasks/pw_ageing.yml
- verify_tasks/netrc.yml
- verify_tasks/ignore_home_folders.yml
- name: Run the equivalent of "apt-get update" as a separate step
apt:
update_cache: true
when: ansible_facts.os_family == 'Debian'
- name: install required tools on debian
apt:
name: procps
when: ansible_facts.os_family == 'Debian'
- name: include netrc tests
include_tasks: verify_tasks/netrc.yml
- 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: download cinc-auditor
get_url:
url: https://omnitruck.cinc.sh/install.sh
dest: /tmp/install.sh
mode: '0775'
- 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: install cinc-auditor
shell: "bash /tmp/install.sh -s -- -P cinc-auditor -v 4"
- name: Execute cinc-auditor tests # noqa ignore-errors
command: "/opt/cinc-auditor/bin/cinc-auditor exec --no-show-progress --no-color --no-distinct-exit https://github.com/dev-sec/linux-baseline/archive/refs/heads/master.zip"
- name: Verify
hosts: localhost
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: Execute cinc-auditor tests
ansible.builtin.command: >
docker run
--volume /run/docker.sock:/run/docker.sock
--volume {{ playbook_dir }}/waivers.yaml:/waivers.yaml
docker.io/cincproject/auditor exec
-t docker://instance
--no-show-progress --no-color
--waiver-file /waivers.yaml
--no-distinct-exit https://github.com/dev-sec/linux-baseline/archive/refs/heads/master.zip
register: test_results
changed_when: false
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
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:
# 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:
- ansible.builtin.include_role:
name: os_hardening
- name: verify os_env_umask
shell:
- name: Verify os_env_umask
ansible.builtin.shell:
cmd: "grep '027 #override' /etc/login.defs"
changed_when: false
@@ -0,0 +1,10 @@
---
- name: Get properties of user user_with_777_home's home-folder
ansible.builtin.stat:
path: /home/user_with_777_home
register: stats
- name: Check that the home-folder has mode 777
ansible.builtin.assert:
that:
- stats.stat.mode == "0777"
+5 -5
View File
@@ -1,19 +1,19 @@
---
- 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
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
ansible.builtin.file:
path: '/root/.netrc'
path: /root/.netrc
state: absent
when: result_test_netrc.state == 'file'
+34 -27
View File
@@ -1,58 +1,65 @@
---
- 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
ansible.builtin.package:
name:
- python3-pip
- python3-setuptools
state: present
- name: set password for test
set_fact:
test_pw: "myTest!pw"
- name: Install pam-tester
ansible.builtin.pip:
name: pam-tester
state: present
executable: /usr/bin/pip3
- name: set locale for test
set_fact:
locale: "en_US.UTF-8"
- name: Set password for test
ansible.builtin.set_fact:
test_pw: myTestpwSage
- name: Set locale for test
ansible.builtin.set_fact:
locale: en_US.UTF-8
when:
- ansible_facts.os_family == 'RedHat'
- ansible_facts.distribution_major_version < '8'
- name: create testuser
user:
- name: Create testuser
ansible.builtin.user:
name: testuser
password: "{{ test_pw | password_hash('sha512') }}"
- name: check successfull login with correct password
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }}"
- name: Check successful login with correct password
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 unsuccessfull login with incorrect password
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }}fail --expectfail"
- name: Check unsuccessful login with incorrect password
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') }}"
LANG: "{{ locale | default('C.UTF-8') }}"
with_sequence: count=6
- name: check unsuccessfull login, with correct password (lockout)
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }} --expectfail"
- name: Check unsuccessful login, with correct password (lockout)
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') }}"
LANG: "{{ locale | default('C.UTF-8') }}"
- name: wait for account to unlock
pause:
- name: Wait for account to unlock
ansible.builtin.pause:
seconds: 20
- name: check successfull login
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }}"
- name: Check successful login
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') }}"
@@ -0,0 +1,32 @@
---
- name: Get Password Expiry date for use pw_no_ageing
ansible.builtin.shell: chage -l pw_no_ageing | grep "Password expires" | cut -d ":" -f 2
changed_when: false
register: expiry_date
- name: Check that the expiry date of pw_no_ageing is "never"
ansible.builtin.assert:
that:
- "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
changed_when: false
register: expiry_date
- name: Check that the expiry date of pw_ageing is 60 days
ansible.builtin.assert:
# 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"
- 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
changed_when: false
register: expiry_warndays
- name: Check that number of days of warning before password expires is 7 days
ansible.builtin.assert:
that:
- "expiry_warndays.stdout | trim == '7'"
@@ -0,0 +1,9 @@
---
- name: Read local linux user database
ansible.builtin.getent:
database: passwd
- name: Check that shell_sys_acc's shell is still bash
ansible.builtin.assert:
that:
- getent_passwd['shell_sys_acc'][5] == "/bin/bash"
+2 -2
View File
@@ -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
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
ansible.builtin.command: grep -e 'gpgcheck\s*=\s*1' /etc/yum.repos.d/bar.repo
changed_when: false
+9
View File
@@ -0,0 +1,9 @@
os-14:
run: false
justification: "ansible does not gather all fact-mounts (e.g. mounts with tmpfs) so we cannot change these. see https://github.com/ansible/ansible/pull/79787"
os-15:
run: false
justification: "ansible does not gather all fact-mounts (e.g. mounts with tmpfs) so we cannot change these. see https://github.com/ansible/ansible/pull/79787"
os-16:
run: false
justification: "ansible does not gather all fact-mounts (e.g. mounts with tmpfs) so we cannot change these. see https://github.com/ansible/ansible/pull/79787"
+6 -2
View File
@@ -8,7 +8,10 @@ driver:
provider:
name: libvirt
platforms:
- name: instance
# 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}"
memory: 1024
cpus: 2
@@ -21,7 +24,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callback_whitelist: profile_tasks, timer, yaml
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
env:
@@ -53,6 +56,7 @@ scenario:
- syntax
- create
- prepare
- check
- converge
- idempotence
- verify
-2
View File
@@ -2,8 +2,6 @@
- name: wrapper playbook for kitchen testing "ansible-os-hardening" with custom vars for testing
hosts: all
become: true
collections:
- devsec.hardening
environment:
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
+31 -41
View File
@@ -6,56 +6,46 @@
http_proxy: "{{ lookup('env', 'http_proxy') | default(omit) }}"
https_proxy: "{{ lookup('env', 'https_proxy') | default(omit) }}"
no_proxy: "{{ lookup('env', 'no_proxy') | default(omit) }}"
roles:
- geerlingguy.git
tasks:
- name: install fake SuSE-release for cinc compatibility
copy:
content: |
openSUSE Faked Enterprise 2020 (x86_64)
VERSION = 2020
CODENAME = Faked Feature
dest: /etc/SuSE-release
owner: root
group: root
mode: '0444'
when: ansible_facts.os_family == 'Suse'
- name: install git for SuSE since geerlinguy.git does not support it
zypper:
name: git
state: present
when: ansible_facts.os_family == 'Suse'
- name: Run the equivalent of "apt-get update" as a separate step
apt:
update_cache: true
when: ansible_facts.os_family == 'Debian'
- name: install required tools on debian
apt:
name: procps
when: ansible_facts.os_family == 'Debian'
- 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
# 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
when: ansible_facts.os_family == 'RedHat'
- name: download cinc-auditor
get_url:
url: https://omnitruck.cinc.sh/install.sh
dest: /tmp/install.sh
mode: '0775'
- name: Verify
hosts: localhost
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: get ssh-config
command:
cmd: "vagrant ssh-config"
chdir: "{{ molecule_ephemeral_directory }}"
register: ssh_config
changed_when: false
- name: install cinc-auditor
shell: "bash /tmp/install.sh -s -- -P cinc-auditor -v 4"
- name: create ssh-config file
copy:
content: "{{ ssh_config.stdout_lines | join ('\n') }}"
dest: "{{ molecule_ephemeral_directory }}/ssh-config"
changed_when: false
- name: Execute cinc-auditor tests # noqa ignore-errors
command: "/opt/cinc-auditor/bin/cinc-auditor exec --no-show-progress --no-color --no-distinct-exit https://github.com/dev-sec/linux-baseline/archive/refs/heads/master.zip"
- name: Execute cinc-auditor tests
command: >
docker run
--volume {{ molecule_ephemeral_directory }}:{{ molecule_ephemeral_directory }}
docker.io/cincproject/auditor exec
--ssh-config-file={{ molecule_ephemeral_directory }}/ssh-config
-t ssh://{{ lookup('env', 'USER') }}
--sudo --no-show-progress --no-color
--no-distinct-exit https://github.com/dev-sec/linux-baseline/archive/refs/heads/master.zip
register: test_results
changed_when: false
ignore_errors: true
+21 -13
View File
@@ -1,9 +1,17 @@
---
- 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:
@@ -21,26 +29,26 @@
name: testuser
password: "{{ test_pw | password_hash('sha512') }}"
- name: check successfull login with correct password
- name: check successful login with correct password
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }}"
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 unsuccessfull login with incorrect password
- name: check unsuccessful login with incorrect password
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }}fail --expectfail"
cmd: "/usr/local/bin/pam-tester --user testuser --password {{ test_pw }}fail --expectfail"
environment:
TMPDIR: /var/tmp
LC_ALL: "{{ locale | default('C.UTF-8') }}"
LANG: "{{ locale | default('C.UTF-8') }}"
with_sequence: count=6
- name: check unsuccessfull login, with correct password (lockout)
- name: check unsuccessful login, with correct password (lockout)
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }} --expectfail"
cmd: "/usr/local/bin/pam-tester --user testuser --password {{ test_pw }} --expectfail"
environment:
TMPDIR: /var/tmp
LC_ALL: "{{ locale | default('C.UTF-8') }}"
@@ -50,9 +58,9 @@
pause:
seconds: 20
- name: check successfull login
- name: check successful login
shell:
cmd: "pam-tester --user testuser --password {{ test_pw }}"
cmd: "/usr/local/bin/pam-tester --user testuser --password {{ test_pw }}"
environment:
TMPDIR: /var/tmp
LC_ALL: "{{ locale | default('C.UTF-8') }}"
+6 -18
View File
@@ -1,28 +1,15 @@
---
dependency:
name: galaxy
options:
role-file: molecule/ssh_hardening/requirements.yml
driver:
name: docker
platforms:
- name: instance
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
image: "ghcr.io/dev-sec/docker-${MOLECULE_DISTRO}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /sys/fs/cgroup:/sys/fs/cgroup:rw
privileged: true
tmpfs:
- /tmp
- /run
capabilities:
- SYS_ADMIN
tty: true
env:
http_proxy: "${http_proxy}"
https_proxy: "${https_proxy}"
no_proxy: "${no_proxy}"
container: docker
cgroupns_mode: host
pre_build_image: true
provisioner:
name: ansible
options:
@@ -30,7 +17,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callback_whitelist: profile_tasks, timer, yaml
callbacks_enabled: profile_tasks, timer, yaml
inventory:
host_vars:
# https://molecule.readthedocs.io/en/latest/examples.html#docker-with-non-privileged-user
@@ -66,6 +53,7 @@ scenario:
- syntax
- create
- prepare
- check
- converge
- idempotence
- verify
-3
View File
@@ -1,3 +0,0 @@
---
roles:
- geerlingguy.git
+8 -37
View File
@@ -1,48 +1,19 @@
---
- name: Verify
hosts: all
become: true
hosts: localhost
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) }}"
roles:
- geerlingguy.git
tasks:
- name: install fake SuSE-release for cinc compatibility
copy:
content: |
openSUSE Faked Enterprise 2020 (x86_64)
VERSION = 2020
CODENAME = Faked Feature
dest: /etc/SuSE-release
owner: root
group: root
mode: '0444'
when: ansible_facts.os_family == 'Suse'
- name: install git for SuSE since geerlinguy.git does not support it
zypper:
name: git
state: present
when: ansible_facts.os_family == 'Suse'
- name: install crypto compat modules on fedora
dnf:
name: libxcrypt-compat
when: ansible_facts.distribution == 'Fedora'
- name: download cinc-auditor
get_url:
url: https://omnitruck.cinc.sh/install.sh
dest: /tmp/install.sh
mode: '0775'
- name: install cinc-auditor
shell: "bash /tmp/install.sh -s -- -P cinc-auditor -v 4"
- name: Execute cinc-auditor tests
command: "/opt/cinc-auditor/bin/cinc-auditor exec --no-show-progress --no-color --no-distinct-exit https://github.com/dev-sec/ssh-baseline/archive/refs/heads/master.zip"
command: >
docker run
--volume /run/docker.sock:/run/docker.sock
docker.io/cincproject/auditor exec
-t docker://instance
--no-show-progress --no-color
--no-distinct-exit https://github.com/dev-sec/ssh-baseline/archive/refs/heads/master.zip
register: test_results
changed_when: false
ignore_errors: true
+22
View File
@@ -0,0 +1,22 @@
*******
Docker driver installation guide
*******
Requirements
============
* Docker Engine
Install
=======
Please refer to the `Virtual environment`_ documentation for installation best
practices. If not using a virtual environment, please consider passing the
widely recommended `'--user' flag`_ when invoking ``pip``.
.. _Virtual environment: https://virtualenv.pypa.io/en/latest/
.. _'--user' flag: https://packaging.python.org/tutorials/installing-packages/#installing-to-the-user-site
.. code-block:: bash
$ python3 -m pip install 'molecule[docker]'
+14
View File
@@ -0,0 +1,14 @@
---
- 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
vars:
sftp_enabled: false
+58
View File
@@ -0,0 +1,58 @@
---
driver:
name: vagrant
provider:
name: libvirt
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}"
memory: 1024
cpus: 2
provisioner:
name: ansible
options:
diff: true
env:
ANSIBLE_PIPELINING: "True"
config_options:
defaults:
interpreter_python: auto_silent
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
env:
ANSIBLE_PIPELINING: "True"
scenario:
create_sequence:
- dependency
- create
- prepare
check_sequence:
- dependency
- destroy
- create
- prepare
- converge
- check
- destroy
converge_sequence:
- dependency
- create
- prepare
- converge
destroy_sequence:
- destroy
test_sequence:
- dependency
- destroy
- syntax
- create
- prepare
- converge
- idempotence
- verify
- destroy
+32
View File
@@ -0,0 +1,32 @@
---
- name: prepare OpenBSD host
hosts: all
become: true
gather_facts: false
tasks:
- 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'"
- name: wrapper playbook for kitchen testing "ansible-ssh-hardening" with default 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) }}"
tasks:
- name: created needed directory
file:
path: "/var/run/sshd"
state: directory
- 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"
changed_when: false
ignore_errors: true
+55
View File
@@ -0,0 +1,55 @@
---
- name: OpenBSD workaround - inspec detects OpenSBD as unix and not linux compatible
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"
state: hard
when: "lookup('env', 'MOLECULE_DISTRO') == 'openbsd7'"
- name: Verify
hosts: localhost
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: get ssh-config
command:
cmd: "vagrant ssh-config"
chdir: "{{ molecule_ephemeral_directory }}"
register: ssh_config
changed_when: false
- name: create ssh-config file
copy:
content: "{{ ssh_config.stdout_lines | join ('\n') }}"
dest: "{{ molecule_ephemeral_directory }}/ssh-config"
changed_when: false
- name: Execute cinc-auditor tests
command: >
docker run
--volume {{ molecule_ephemeral_directory }}:{{ molecule_ephemeral_directory }}
--volume ./waivers_{{ lookup('env', 'MOLECULE_DISTRO') }}.yaml:/waivers.yaml
docker.io/cincproject/auditor exec
--ssh-config-file={{ molecule_ephemeral_directory }}/ssh-config
-t ssh://{{ lookup('env', 'USER') }}
--sudo --no-show-progress --no-color
--waiver-file /waivers.yaml
--no-distinct-exit https://github.com/dev-sec/ssh-baseline/archive/refs/heads/master.zip
register: test_results
changed_when: false
ignore_errors: true
- name: Display details about the cinc-auditor results
debug:
msg: "{{ test_results.stdout_lines }}"
- name: Fail when tests fail
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,21 @@
ssh-17:
run: false
justification: "GSSAPIAuthentication is disabled. see: https://github.com/dev-sec/ansible-collection-hardening/pull/598"
ssh-18:
run: false
justification: "GSSAPIDelegateCredentials is disabled. see: https://github.com/dev-sec/ansible-collection-hardening/pull/598"
sshd-30:
run: false
justification: "KerberosAuthentication is disabled. see: https://github.com/dev-sec/ansible-ssh-hardening/pull/171"
sshd-31:
run: false
justification: "KerberosOrLocalPasswd is disabled. see: https://github.com/dev-sec/ansible-ssh-hardening/pull/171"
sshd-32:
run: false
justification: "KerberosTicketCleanup is disabled. see: https://github.com/dev-sec/ansible-ssh-hardening/pull/171"
sshd-33:
run: false
justification: "GSSAPIAuthentication is disabled. see: https://github.com/dev-sec/ansible-collection-hardening/pull/598"
sshd-34:
run: false
justification: "GSSAPICleanupCredentials is disabled. see: https://github.com/dev-sec/ansible-collection-hardening/pull/598"
@@ -20,11 +20,6 @@
- path: "/etc/ssh/auth_principals/root"
principals:
- "root"
owner: "{{ ssh_owner }}"
group: "{{ ssh_group }}"
directoryowner: "{{ ssh_owner }}"
directorygroup: "{{ ssh_group }}"
directorymode: "0700"
network_ipv6_enable: true
ssh_allow_tcp_forwarding: 'yes'
ssh_gateway_ports: true
@@ -1,28 +1,15 @@
---
dependency:
name: galaxy
options:
role-file: molecule/ssh_hardening/requirements.yml
driver:
name: docker
platforms:
- name: instance
image: "rndmh3ro/docker-${MOLECULE_DISTRO}-ansible:latest"
image: "ghcr.io/dev-sec/docker-${MOLECULE_DISTRO}-ansible:latest"
command: ${MOLECULE_DOCKER_COMMAND:-/lib/systemd/systemd}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /sys/fs/cgroup:/sys/fs/cgroup:rw
privileged: true
tmpfs:
- /tmp
- /run
capabilities:
- SYS_ADMIN
tty: true
env:
http_proxy: "${http_proxy}"
https_proxy: "${https_proxy}"
no_proxy: "${no_proxy}"
container: docker
cgroupns_mode: host
pre_build_image: true
provisioner:
name: ansible
options:
@@ -30,7 +17,7 @@ provisioner:
config_options:
defaults:
interpreter_python: auto_silent
callback_whitelist: profile_tasks, timer, yaml
callbacks_enabled: profile_tasks, timer, yaml
verifier:
name: ansible
@@ -60,6 +47,7 @@ scenario:
- syntax
- create
- prepare
- check
- converge
- idempotence
- verify
@@ -1,3 +0,0 @@
---
roles:
- geerlingguy.git
+15
View File
@@ -0,0 +1,15 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base",
":gitSignOff"
],
"dependencyDashboard": true,
"dependencyDashboardAutoclose": true,
"packageRules": [
{
"matchUpdateTypes": ["patch", "minor"],
"automerge": true
}
]
}
+2 -1
View File
@@ -1,4 +1,5 @@
molecule[docker]
molecule
molecule-plugins[docker]
yamllint
ansible
ansible-lint
+1 -1
View File
@@ -91,7 +91,7 @@
**Implemented enhancements:**
- add follow=yes to my.cnf protect task, incase its a symlink. fixes \#20 [\#21](https://github.com/dev-sec/ansible-mysql-hardening/pull/21) ([rndmh3ro](https://github.com/rndmh3ro))
- add follow=yes to my.cnf protect task, in case its a symlink. fixes \#20 [\#21](https://github.com/dev-sec/ansible-mysql-hardening/pull/21) ([rndmh3ro](https://github.com/rndmh3ro))
- add changelog generator [\#7](https://github.com/dev-sec/ansible-mysql-hardening/pull/7) ([chris-rock](https://github.com/chris-rock))
**Closed issues:**
+110 -54
View File
@@ -1,6 +1,6 @@
# devsec.mysql_hardening
![devsec.mysql_hardening](https://github.com/dev-sec/ansible-os-hardening/workflows/devsec.mysql_hardening/badge.svg)
![devsec.mysql_hardening](https://github.com/dev-sec/ansible-collection-hardening/workflows/devsec.mysql_hardening/badge.svg)
## Description
@@ -12,74 +12,130 @@ 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.
| Platform | Versions |
| -------- | -------------------- |
| 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 -->
+3 -5
View File
@@ -6,10 +6,8 @@ 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!!!<====-----'
mysql_root_password: "-----====>SetR00tPa$$wordH3r3!!!<====-----"
# There .my.cnf with mysql root credentials will be installed
mysql_user_home: "{{ ansible_env.HOME }}"
@@ -48,6 +46,6 @@ mysql_hardening_options:
automatic-sp-privileges: 0
# @see https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option-mysqld-secure-file-priv
secure-file-priv: '/tmp'
secure-file-priv: /tmp
# @see https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_user
user: '{{ mysql_hardening_user }}'
user: "{{ mysql_hardening_user }}"
+2 -3
View File
@@ -1,7 +1,6 @@
---
- name: Restart mysql
service:
name: '{{ mysql_daemon }}'
ansible.builtin.service:
name: "{{ mysql_daemon }}"
state: restarted
when: mysql_hardening_restart_mysql | bool
@@ -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.
+5 -4
View File
@@ -1,15 +1,16 @@
---
galaxy_info:
author: "Sebastian Gumprich"
description: 'This Ansible playbook provides security configuration for mysql.'
author: Sebastian Gumprich
description: This Ansible playbook provides security configuration for mysql.
company: Hardening Framework Team
license: Apache License 2.0
min_ansible_version: '2.9.10'
min_ansible_version: 2.9.10
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- name: Ubuntu
versions:
- bionic
@@ -20,7 +21,7 @@ galaxy_info:
- bullseye
- buster
- name: Amazon
- name: Fedora
- name: opensuse
galaxy_tags:
- system
- security
+40 -36
View File
@@ -1,64 +1,68 @@
---
- name: Protect my.cnf
file:
path: '{{ mysql_hardening_mysql_conf_file }}'
mode: '0640'
owner: '{{ mysql_cnf_owner }}'
group: '{{ mysql_cnf_group }}'
ansible.builtin.file:
path: "{{ mysql_hardening_mysql_conf_file }}"
mode: "0640"
owner: "{{ mysql_cnf_owner }}"
group: "{{ mysql_cnf_group }}"
follow: true
state: file
- name: Ensure permissions on mysql-datadir are correct
file:
path: '{{ item }}'
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: '{{ mysql_hardening_user }}'
group: '{{ mysql_hardening_user }}'
mode: '0750'
owner: "{{ mysql_hardening_user }}"
group: "{{ mysql_hardening_user }}"
mode: "0750"
when: item is defined and item != ""
loop:
- '{{ mysql_settings.settings.datadir }}'
- "{{ mysql_settings.settings.datadir }}"
- '{{ mysql_datadir | default("") }}'
- name: Ensure permissions on mysql-logfile are correct
file:
path: '{{ item }}'
ansible.builtin.file:
path: "{{ item }}"
state: file
owner: '{{ mysql_hardening_user }}'
group: '{{ mysql_hardening_group }}'
mode: '0640'
when: item is defined and item != ""
owner: "{{ mysql_hardening_user }}"
group: "{{ mysql_hardening_group }}"
mode: "0640"
when:
- item is defined
- item != ""
- item != "stderr"
- item != "stdout"
loop:
- '{{ mysql_settings.settings.log_error }}'
- "{{ mysql_settings.settings.log_error }}"
- '{{ mysql_hardening_log_file | default("") }}'
- name: Check mysql configuration-directory exists and has right permissions
file:
path: '{{ mysql_hardening_mysql_confd_dir }}'
ansible.builtin.file:
path: "{{ mysql_hardening_mysql_confd_dir }}"
state: directory
owner: '{{ mysql_hardening_user }}'
group: '{{ mysql_hardening_group }}'
mode: '0750'
owner: "{{ mysql_hardening_user }}"
group: "{{ mysql_hardening_group }}"
mode: "0750"
- name: Check include-dir directive is present in my.cnf
lineinfile:
dest: '{{ mysql_hardening_mysql_conf_file }}'
line: '!includedir {{ mysql_hardening_mysql_confd_dir }}'
insertafter: 'EOF'
ansible.builtin.lineinfile:
dest: "{{ mysql_hardening_mysql_conf_file }}"
line: "!includedir {{ mysql_hardening_mysql_confd_dir }}"
insertafter: EOF
state: present
backup: true
notify: Restart mysql
- name: Apply hardening configuration
template:
src: 'hardening.cnf.j2'
dest: '{{ mysql_hardening_mysql_hardening_conf_file }}'
owner: '{{ mysql_cnf_owner }}'
group: '{{ mysql_cnf_group }}'
mode: '0640'
ansible.builtin.template:
src: hardening.cnf.j2
dest: "{{ mysql_hardening_mysql_confd_dir + '/hardening.cnf' }}"
owner: "{{ mysql_cnf_owner }}"
group: "{{ mysql_cnf_group }}"
mode: "0640"
notify: Restart mysql
- name: Enable mysql
service:
name: '{{ mysql_daemon }}'
enabled: '{{ mysql_daemon_enabled }}'
ansible.builtin.service:
name: "{{ mysql_daemon }}"
enabled: "{{ mysql_daemon_enabled }}"
+18 -18
View File
@@ -1,31 +1,31 @@
---
- name: Fetch OS dependent variables
include_vars:
file: '{{ item }}'
name: 'os_vars'
ansible.builtin.include_vars:
file: "{{ item }}"
name: os_vars
with_first_found:
- files:
- '{{ ansible_facts.distribution }}_{{ ansible_facts.distribution_major_version }}.yml'
- '{{ ansible_facts.distribution }}.yml'
- '{{ ansible_facts.os_family }}_{{ ansible_facts.distribution_major_version }}.yml'
- '{{ ansible_facts.os_family }}.yml'
- "{{ ansible_facts.distribution }}_{{ ansible_facts.distribution_major_version }}.yml"
- "{{ ansible_facts.distribution }}.yml"
- "{{ ansible_facts.os_family }}_{{ ansible_facts.distribution_major_version }}.yml"
- "{{ ansible_facts.os_family }}.yml"
skip: true
tags: always
# we only override variables with our default if they have not been specified already.
# by default the lookup functions finds all varnames containing the string, therefore
# we add ^ and $ to denote start and end of string, so this returns only exact maches.
- name: Set OS dependent variables, if not already defined by user # noqa var-naming
set_fact:
'{{ item.key }}': '{{ item.value }}'
when: "not lookup('varnames', '^' + item.key + '$')"
with_dict: '{{ os_vars }}'
# we add ^ and $ to denote start and end of string, so this returns only exact matches.
- name: Set OS dependent variables, if not already defined by user # noqa var-naming
ansible.builtin.set_fact:
"{{ item.key }}": "{{ item.value }}"
when: not lookup('varnames', '^' + item.key + '$')
with_dict: "{{ os_vars }}"
tags: always
- name: Check that the variable mysql_distribution is set correctly
ansible.builtin.assert:
that: mysql_distribution == 'mysql' or mysql_distribution == 'mariadb'
fail_msg: 'mysql_distribution must be set to either mysql or mariadb!'
fail_msg: mysql_distribution must be set to either mysql or mariadb!
when: mysql_distribution is defined
- name: Gather package facts to check for mysql/mariadb version
@@ -34,7 +34,7 @@
when: not mysql_distribution is defined
- name: Check if MySQL or MariaDB is used
set_fact:
ansible.builtin.set_fact:
mysql_distribution: "{{ ansible_facts.packages['mysql-server'] is defined | ternary('mysql', 'mariadb') }}"
when: not mysql_distribution is defined
@@ -53,20 +53,20 @@
# see https://stackoverflow.com/a/59451077/2953919 for the
# dict2items and vice versa magic
- name: Drop the secure-auth parameter on MySQL >=8.0.3 (not mariadb)
set_fact:
ansible.builtin.set_fact:
mysql_hardening_options: "{{ mysql_hardening_options | dict2items | rejectattr('key', 'search', 'secure-auth') | list | items2dict }}"
when:
- mysql_version.version.full is version('8.0.3', '>=')
- mysql_distribution == "mysql"
- name: Include tasks for configuration
import_tasks: configure.yml
ansible.builtin.import_tasks: configure.yml
when: mysql_hardening_enabled | bool
tags:
- mysql_hardening
- name: Include tasks to secure mysql installation
import_tasks: mysql_secure_installation.yml
ansible.builtin.import_tasks: mysql_secure_installation.yml
when: mysql_hardening_enabled | bool
tags:
- mysql_hardening
@@ -1,22 +1,22 @@
---
- name: Fail the role if the mysql root password was not set
fail:
msg: 'ERROR - you have to change default mysql_root_password'
ansible.builtin.fail:
msg: ERROR - you have to change default mysql_root_password
when: mysql_root_password == '-----====>SetR00tPa$$wordH3r3!!!<====-----'
- name: Ensure that the root password is present
community.mysql.mysql_user:
name: 'root'
name: root
host_all: true
password: '{{ mysql_root_password | mandatory }}'
password: "{{ mysql_root_password | mandatory }}"
state: present
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
- name: Install .my.cnf with credentials
template:
src: 'my.cnf.j2'
dest: '{{ mysql_user_home }}/.my.cnf'
mode: '0400'
ansible.builtin.template:
src: my.cnf.j2
dest: "{{ mysql_user_home }}/.my.cnf"
mode: "0400"
tags: my_cnf
- name: Ensure that the test database is absent
@@ -28,7 +28,7 @@
- name: Ensure that anonymous users are absent
community.mysql.mysql_user:
name: ''
name: ""
state: absent
host_all: true
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
@@ -36,69 +36,59 @@
- name: Ensure that root can only login from localhost
community.mysql.mysql_query:
query:
- DELETE
FROM mysql.user
WHERE USER='root'
AND HOST NOT IN ('localhost',
'127.0.0.1',
'::1')
query: >
DELETE
FROM mysql.user
WHERE USER='root'
AND HOST NOT IN ('localhost',
'127.0.0.1',
'::1');
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
when: mysql_remove_remote_root
- 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:
- SELECT GROUP_CONCAT(QUOTE(USER), '@', QUOTE(HOST) SEPARATOR ', ') AS users
FROM mysql.user
WHERE (length(authentication_string)=0
OR authentication_string="")
AND USER NOT IN ('mysql.sys',
'mysqlxsys',
'mariadb.sys');
query: >
SELECT CONCAT(QUOTE(USER), '@', QUOTE(HOST)) AS user
FROM mysql.user
WHERE (length(authentication_string)=0
OR authentication_string="")
AND USER NOT IN ('mysql.sys',
'mysqlxsys',
'mariadb.sys');
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
register: mysql_users_wo_passwords_or_auth_string
when:
- (mysql_distribution == "mysql" and mysql_version.version.full is version('5.7.6', '>=')) or
(mysql_distribution == "mariadb" and mysql_version.version.full is version('10.4.0', '>='))
check_mode: false
when: >
(mysql_distribution == "mysql" and mysql_version.version.full is version('5.7.6', '>=')) or
(mysql_distribution == "mariadb" and mysql_version.version.full
is version('10.4.0', '>='))
- name: Get all users that have no password or authentication_string on MySQL version < 5.7.6 or Mariadb version < 10.4.0
community.mysql.mysql_query:
query:
- SELECT GROUP_CONCAT(QUOTE(USER), '@', QUOTE(HOST) SEPARATOR ', ') AS users
FROM mysql.user
WHERE (length(password)=0
OR password="")
AND (length(authentication_string)=0
OR authentication_string="")
AND USER NOT IN ('mysql.sys',
'mysqlxsys',
'mariadb.sys');
query: >
SELECT CONCAT(QUOTE(USER), '@', QUOTE(HOST)) AS user
FROM mysql.user
WHERE (length(password)=0
OR password="")
AND (length(authentication_string)=0
OR authentication_string="")
AND USER NOT IN ('mysql.sys',
'mysqlxsys',
'mariadb.sys');
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
register: mysql_users_wo_passwords
when:
- (mysql_distribution == "mysql" and mysql_version.version.full is version('5.7.6', '<')) or
(mysql_distribution == "mariadb" and mysql_version.version.full is version('10.4.0', '<'))
- name: Create a fact for users without password or authentication_string
set_fact:
users_wo_auth: "{{ mysql_users_wo_passwords_or_auth_string.query_result.0.0 | community.general.json_query('users') }}"
when:
- mysql_users_wo_passwords_or_auth_string.query_result is defined
- mysql_users_wo_passwords_or_auth_string.query_result != "" # noqa empty-string-compare
- name: Create a fact for users without password
set_fact:
users_wo_auth: "{{ mysql_users_wo_passwords.query_result.0.0 | community.general.json_query('users') }}"
when:
- mysql_users_wo_passwords.query_result is defined
- mysql_users_wo_passwords.query_result != "" # noqa empty-string-compare
check_mode: false
when: >
(mysql_distribution == "mysql" and mysql_version.version.full is version('5.7.6', '<')) or
(mysql_distribution == "mariadb" and mysql_version.version.full is
version('10.4.0', '<'))
- name: Ensure that there are no users without password or authentication_string
community.mysql.mysql_query:
query:
- "DROP USER {{ users_wo_auth }}"
- DROP USER {{ item.user }}
login_unix_socket: "{{ login_unix_socket | default(omit) }}"
when:
- users_wo_auth is defined
- users_wo_auth != "" # noqa empty-string-compare
with_community.general.flattened:
- "{{ mysql_users_wo_passwords.query_result | default([]) }}"
- "{{ mysql_users_wo_passwords_or_auth_string.query_result | default([]) }}"
+5 -5
View File
@@ -1,10 +1,10 @@
---
mysql_daemon: mariadb
mysql_hardening_mysql_conf_file: '/etc/mysql/my.cnf'
mysql_hardening_mysql_confd_dir: '/etc/mysql/conf.d'
mysql_hardening_mysql_conf_file: /etc/mysql/my.cnf
mysql_hardening_mysql_confd_dir: /etc/mysql/conf.d
mysql_hardening_group: 'adm'
mysql_hardening_group: adm
mysql_cnf_owner: 'root' # owner of /etc/mysql/*.cnf files
mysql_cnf_group: 'mysql' # owner of /etc/mysql/*.cnf files
mysql_cnf_owner: root # owner of /etc/mysql/*.cnf files
mysql_cnf_group: mysql # owner of /etc/mysql/*.cnf files
+2 -2
View File
@@ -1,4 +1,4 @@
---
mysql_daemon: mysqld
mysql_hardening_mysql_conf_file: '/etc/my.cnf'
mysql_hardening_mysql_confd_dir: '/etc/my.cnf.d'
mysql_hardening_mysql_conf_file: /etc/my.cnf
mysql_hardening_mysql_confd_dir: /etc/my.cnf.d
+5 -5
View File
@@ -1,10 +1,10 @@
---
mysql_daemon: mysql-server
mysql_hardening_mysql_conf_file: '/usr/local/etc/mysql/my.cnf'
mysql_hardening_mysql_confd_dir: '/usr/local/etc/mysql/conf.d'
mysql_hardening_mysql_conf_file: /usr/local/etc/mysql/my.cnf
mysql_hardening_mysql_confd_dir: /usr/local/etc/mysql/conf.d
mysql_hardening_group: 'mysql'
mysql_hardening_group: mysql
mysql_cnf_owner: 'root' # owner of /usr/local/etc/mysql/*.cnf files
mysql_cnf_group: 'mysql' # owner of /usr/local/etc/mysql/*.cnf files
mysql_cnf_owner: root # owner of /usr/local/etc/mysql/*.cnf files
mysql_cnf_group: mysql # owner of /usr/local/etc/mysql/*.cnf files
+3 -3
View File
@@ -1,7 +1,7 @@
---
mysql_daemon: mysqld
mysql_hardening_mysql_conf_file: '/etc/my.cnf'
mysql_hardening_mysql_confd_dir: '/etc/my.cnf.d'
mysql_hardening_mysql_conf_file: /etc/my.cnf
mysql_hardening_mysql_confd_dir: /etc/my.cnf.d
mysql_hardening_group: 'adm'
mysql_hardening_group: adm
+5 -5
View File
@@ -1,9 +1,9 @@
---
mysql_daemon: mariadb
mysql_hardening_mysql_conf_file: '/etc/my.cnf'
mysql_hardening_mysql_confd_dir: '/etc/my.cnf.d'
mysql_hardening_mysql_conf_file: /etc/my.cnf
mysql_hardening_mysql_confd_dir: /etc/my.cnf.d
mysql_cnf_owner: 'root' # owner of /etc/mysql/*.cnf files
mysql_cnf_group: 'mysql' # owner of /etc/mysql/*.cnf files
mysql_cnf_owner: root # owner of /etc/mysql/*.cnf files
mysql_cnf_group: mysql # owner of /etc/mysql/*.cnf files
mysql_hardening_group: 'mysql'
mysql_hardening_group: mysql
+5 -5
View File
@@ -1,10 +1,10 @@
---
mysql_daemon: mysql
mysql_hardening_mysql_conf_file: '/etc/mysql/my.cnf'
mysql_hardening_mysql_confd_dir: '/etc/mysql/conf.d'
mysql_hardening_mysql_conf_file: /etc/mysql/my.cnf
mysql_hardening_mysql_confd_dir: /etc/mysql/conf.d
mysql_cnf_owner: 'root' # owner of /etc/mysql/*.cnf files
mysql_cnf_group: 'mysql' # owner of /etc/mysql/*.cnf files
mysql_cnf_owner: root # owner of /etc/mysql/*.cnf files
mysql_cnf_group: mysql # owner of /etc/mysql/*.cnf files
mysql_hardening_group: 'adm'
mysql_hardening_group: adm
+1 -2
View File
@@ -1,3 +1,2 @@
---
mysql_hardening_user: 'mysql' # owner of data
mysql_hardening_user: mysql # owner of data
+116 -84
View File
@@ -15,103 +15,135 @@ It works with the following nginx-roles, including, but not limited to:
**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
| Platform | Versions |
| -------- | -------------------- |
| 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: str
- 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: str
- 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][]
- 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][]
- Type: bool
- Required: no
- `nginx_send_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: 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: `False`
- 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 -->
+15 -15
View File
@@ -1,20 +1,20 @@
---
nginx_client_body_buffer_size: '1k'
nginx_client_body_buffer_size: 1k
nginx_remove_default_site: true
nginx_client_max_body_size: '1k'
nginx_keepalive_timeout: '5 5'
nginx_server_tokens: 'off'
nginx_client_header_buffer_size: "1k"
nginx_large_client_header_buffers: "2 1k"
nginx_client_max_body_size: 1k
nginx_keepalive_timeout: 5 5
nginx_server_tokens: "off"
nginx_client_header_buffer_size: 1k
nginx_large_client_header_buffers: 2 1k
nginx_client_body_timeout: "10"
nginx_client_header_timeout: "10"
nginx_send_timeout: "10"
nginx_limit_conn_zone: "$binary_remote_addr zone=default:10m"
nginx_limit_conn: "default 5"
nginx_configuration_dir: "/etc/nginx"
nginx_configuration_hardening_dir: "/etc/nginx"
nginx_owner_user: "root"
nginx_owner_group: "root"
nginx_limit_conn_zone: $binary_remote_addr zone=default:10m
nginx_limit_conn: default 5
nginx_configuration_dir: /etc/nginx
nginx_configuration_hardening_dir: /etc/nginx
nginx_owner_user: root
nginx_owner_group: root
nginx_add_header:
# avoid clickjacking
- X-Frame-Options SAMEORIGIN
@@ -25,9 +25,9 @@ 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"
nginx_ssl_ciphers: "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"
nginx_ssl_protocols: TLSv1.2 TLSv1.3
# yamllint disable-line rule:line-length
nginx_ssl_ciphers: 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
nginx_ssl_session_tickets: "off"
nginx_dh_size: "4096"
+2 -2
View File
@@ -1,5 +1,5 @@
---
- name: Restart nginx
service:
name: "nginx"
ansible.builtin.service:
name: nginx
state: restarted
@@ -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: false
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: str
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: str
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
+5 -3
View File
@@ -1,15 +1,16 @@
---
galaxy_info:
author: "Sebastian Gumprich"
description: 'This Ansible role provides secure nginx configurations. http://dev-sec.io/'
author: Sebastian Gumprich
description: This Ansible role provides secure nginx configurations. http://dev-sec.io/
company: Hardening Framework Team
license: Apache License 2.0
min_ansible_version: '2.9.10'
min_ansible_version: 2.9.10
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- name: Ubuntu
versions:
- bionic
@@ -19,6 +20,7 @@ galaxy_info:
versions:
- buster
- bullseye
- name: Amazon
galaxy_tags:
- system
- security
+30 -30
View File
@@ -1,81 +1,81 @@
---
- name: Create additional configuration
template:
src: "hardening.conf.j2"
ansible.builtin.template:
src: hardening.conf.j2
dest: "{{ nginx_configuration_dir }}/conf.d/90.hardening.conf"
mode: '0600'
mode: "0600"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Change configuration in main nginx.conf
lineinfile:
ansible.builtin.lineinfile:
dest: "{{ nginx_configuration_dir }}/nginx.conf"
regexp: '^\s*server_tokens'
regexp: ^\s*server_tokens
line: " server_tokens {{ nginx_server_tokens }};"
insertafter: "http {"
mode: '0640'
insertafter: http {
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Change ssl_protocols in main nginx.conf
lineinfile:
ansible.builtin.lineinfile:
dest: "{{ nginx_configuration_dir }}/nginx.conf"
regexp: '^\s*ssl_protocols'
regexp: ^\s*ssl_protocols
line: " ssl_protocols {{ nginx_ssl_protocols }};"
insertafter: "http {"
mode: '0640'
insertafter: http {
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Change ssl_prefer_server_ciphers in main nginx.conf
lineinfile:
ansible.builtin.lineinfile:
dest: "{{ nginx_configuration_dir }}/nginx.conf"
regexp: '^\s*ssl_prefer_server_ciphers'
regexp: ^\s*ssl_prefer_server_ciphers
line: " ssl_prefer_server_ciphers {{ nginx_ssl_prefer_server_ciphers }};"
insertafter: "http {"
mode: '0640'
insertafter: http {
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Change client_max_body_size in main nginx.conf
lineinfile:
ansible.builtin.lineinfile:
dest: "{{ nginx_configuration_dir }}/nginx.conf"
regexp: '^\s*client_max_body_size'
regexp: ^\s*client_max_body_size
line: " client_max_body_size {{ nginx_client_max_body_size }};"
insertafter: "http {"
mode: '0640'
insertafter: http {
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Change client_body_buffer_size in main nginx.conf
lineinfile:
ansible.builtin.lineinfile:
dest: "{{ nginx_configuration_dir }}/nginx.conf"
regexp: '^\s*client_body_buffer_size'
regexp: ^\s*client_body_buffer_size
line: " client_body_buffer_size {{ nginx_client_body_buffer_size }};"
insertafter: "http {"
mode: '0640'
insertafter: http {
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Change keepalive_timeout in main nginx.conf
lineinfile:
ansible.builtin.lineinfile:
dest: "{{ nginx_configuration_dir }}/nginx.conf"
regexp: '^\s*keepalive_timeout'
regexp: ^\s*keepalive_timeout
line: " keepalive_timeout {{ nginx_keepalive_timeout }};"
insertafter: "http {"
mode: '0640'
insertafter: http {
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
- name: Remove default.conf
file:
ansible.builtin.file:
path: "{{ item }}"
state: absent
when: nginx_remove_default_site
@@ -85,10 +85,10 @@
- "{{ nginx_configuration_dir }}/sites-enabled/default"
- name: Generate dh group
openssl_dhparam:
community.crypto.openssl_dhparam:
path: "{{ nginx_configuration_dir }}/dh{{ nginx_dh_size }}.pem"
size: "{{ nginx_dh_size }}"
mode: '0640'
mode: "0640"
owner: "{{ nginx_owner_user }}"
group: "{{ nginx_owner_group }}"
notify: Restart nginx
+5 -5
View File
@@ -54,7 +54,7 @@
- fix fedora build [\#296](https://github.com/dev-sec/ansible-os-hardening/pull/296) ([rndmh3ro](https://github.com/rndmh3ro))
- do not blacklist used filesystems [\#289](https://github.com/dev-sec/ansible-os-hardening/pull/289) ([schurzi](https://github.com/schurzi))
- move hidepid vars into defaults so theyre overwritable [\#285](https://github.com/dev-sec/ansible-os-hardening/pull/285) ([rndmh3ro](https://github.com/rndmh3ro))
- move hidepid vars into defaults so they're overwritable [\#285](https://github.com/dev-sec/ansible-os-hardening/pull/285) ([rndmh3ro](https://github.com/rndmh3ro))
## [6.1.0](https://github.com/dev-sec/ansible-os-hardening/tree/6.1.0) (2020-07-21)
@@ -118,7 +118,7 @@
- Add kernel parameter information to README [\#259](https://github.com/dev-sec/ansible-os-hardening/pull/259) ([jaredledvina](https://github.com/jaredledvina))
- Remove trailing whitespaces \(ansible-lint 201\) [\#254](https://github.com/dev-sec/ansible-os-hardening/pull/254) ([kravietz](https://github.com/kravietz))
- Standardize the var ordering [\#251](https://github.com/dev-sec/ansible-os-hardening/pull/251) ([dustinmiller1337](https://github.com/dustinmiller1337))
- Add intial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-os-hardening/pull/250) ([dustinmiller1337](https://github.com/dustinmiller1337))
- Add initial support for OpenSUSE [\#250](https://github.com/dev-sec/ansible-os-hardening/pull/250) ([dustinmiller1337](https://github.com/dustinmiller1337))
- Make max_log_file_action for auditd configurable [\#246](https://github.com/dev-sec/ansible-os-hardening/pull/246) ([jandd](https://github.com/jandd))
- Add exception in sysctl task [\#240](https://github.com/dev-sec/ansible-os-hardening/pull/240) ([ghost](https://github.com/ghost))
- Fedora - Use new auto ansible_python_interpreter for dnf [\#239](https://github.com/dev-sec/ansible-os-hardening/pull/239) ([jaredledvina](https://github.com/jaredledvina))
@@ -193,7 +193,7 @@
**Fixed bugs:**
- auditd causing v5.0 to fail on unpriviledged LXC's [\#191](https://github.com/dev-sec/ansible-os-hardening/issues/191)
- auditd causing v5.0 to fail on unprivileged LXC's [\#191](https://github.com/dev-sec/ansible-os-hardening/issues/191)
- Setting os_security_users_allow has no effect [\#175](https://github.com/dev-sec/ansible-os-hardening/issues/175)
- add /usr/bin/su to suid_guid whitelist [\#199](https://github.com/dev-sec/ansible-os-hardening/pull/199) ([ccolic](https://github.com/ccolic))
- ensure that permissions to su-binary are not restricted to root user and group only, if os_security_users_allow contains the value change_user [\#197](https://github.com/dev-sec/ansible-os-hardening/pull/197) ([szEvEz](https://github.com/szEvEz))
@@ -374,7 +374,7 @@
- Docker [\#90](https://github.com/dev-sec/ansible-os-hardening/pull/90) ([rndmh3ro](https://github.com/rndmh3ro))
- debian 8 support [\#88](https://github.com/dev-sec/ansible-os-hardening/pull/88) ([rndmh3ro](https://github.com/rndmh3ro))
- Ufw manage defaults [\#85](https://github.com/dev-sec/ansible-os-hardening/pull/85) ([fitz123](https://github.com/fitz123))
- replace ignore_errors to failed_when to supress ugly error warnings [\#81](https://github.com/dev-sec/ansible-os-hardening/pull/81) ([fitz123](https://github.com/fitz123))
- replace ignore_errors to failed_when to suppress ugly error warnings [\#81](https://github.com/dev-sec/ansible-os-hardening/pull/81) ([fitz123](https://github.com/fitz123))
- fix bare variables usage for loops [\#79](https://github.com/dev-sec/ansible-os-hardening/pull/79) ([fitz123](https://github.com/fitz123))
**Fixed bugs:**
@@ -487,7 +487,7 @@
- Repair debian install script [\#8](https://github.com/dev-sec/ansible-os-hardening/pull/8) ([rndmh3ro](https://github.com/rndmh3ro))
- Separate tasks into multiple smaller files [\#7](https://github.com/dev-sec/ansible-os-hardening/pull/7) ([rndmh3ro](https://github.com/rndmh3ro))
- Enable gpg-check on all yum-repositories [\#5](https://github.com/dev-sec/ansible-os-hardening/pull/5) ([rndmh3ro](https://github.com/rndmh3ro))
- Change playbook-path to accomodate test-repo [\#4](https://github.com/dev-sec/ansible-os-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))
- Change playbook-path to accommodate test-repo [\#4](https://github.com/dev-sec/ansible-os-hardening/pull/4) ([rndmh3ro](https://github.com/rndmh3ro))
- treat securetty config as an array [\#3](https://github.com/dev-sec/ansible-os-hardening/pull/3) ([arlimus](https://github.com/arlimus))
- Add Securetty-support [\#2](https://github.com/dev-sec/ansible-os-hardening/pull/2) ([rndmh3ro](https://github.com/rndmh3ro))
- Add profile.conf configuration [\#1](https://github.com/dev-sec/ansible-os-hardening/pull/1) ([rndmh3ro](https://github.com/rndmh3ro))
File diff suppressed because it is too large. Load diff
+73 -65
View File
@@ -2,27 +2,28 @@
os_desktop_enable: false
os_env_extra_user_paths: []
os_auth_pw_max_age: 60
os_auth_pw_min_age: 7 # Discourage password cycling
os_auth_pw_remember: 5 # Specify how many used passwords are record
os_auth_pw_min_age: 7 # Discourage password cycling
os_auth_pw_warn_age: 7
os_auth_pw_remember: 5 # Specify how many used passwords are record
os_auth_retries: 5
os_auth_lockout_time: 600 # Seconds (600 = 10min)
os_auth_lockout_time: 600 # Seconds (600 = 10min)
os_auth_timeout: 60
os_auth_allow_homeless: false
os_auth_pam_oddjob_mkhomedir: false
os_auth_pam_passwdqc_enable: true
os_auth_pam_passwdqc_options: 'min=disabled,disabled,16,12,8' # Used in Debian
os_auth_pam_pwquality_options: 'try_first_pass retry=3 authtok_type=' # Used in RHEL7 and RHEL8
os_auth_pam_passwdqc_options: min=disabled,disabled,16,12,8 # Used in Debian
os_auth_pam_pwquality_options: try_first_pass retry=3 authtok_type= # Used in RHEL7 and RHEL8
os_auth_root_ttys: [console, tty1, tty2, tty3, tty4, tty5, tty6]
os_chfn_restrict: ""
os_chfn_restrict: ''
# Set to false to disable chmod userhome folders to 700
# Set to `false` to disable "chmod 700" of home folders for regular users
os_chmod_rootuser_home_folder: true
os_chmod_home_folders: true
# Specify user accounts, whose home folders shouldn't be chmodded to 700 when "os_chmod_home_folders" is enabled.
os_ignore_home_folder_users: []
# May contain: change_user
os_security_users_allow: []
# Specify user home folders in /home that shouldn't be chmodded to 700
os_ignore_home_folder_users: ['lost+found']
# Set to false to disable password age enforcement on existing users
os_rootuser_pw_ageing: false
@@ -30,8 +31,14 @@ os_rootuser_pw_ageing: false
# When enabled and there are multiple users with UID=0, only "root" will be kept. Others will be deleted.
os_remove_additional_root_users: false
# Set to false to disable password age enforcement on existing users
os_user_pw_ageing: true
# List of users, where password ageing should not be enforced even if "os_user_pw_ageing" is enabled
os_users_without_password_ageing: []
# Specify system accounts whose login should not be disabled and password not changed
os_ignore_users: ['vagrant', 'kitchen']
os_ignore_users: [vagrant, kitchen]
os_security_kernel_enable_module_loading: true
os_security_kernel_enable_core_dump: false
os_security_suid_sgid_enforce: true
@@ -43,8 +50,7 @@ os_security_suid_sgid_remove_from_unknown: false
# Remove packages with known security issues
os_security_packages_clean: true
os_security_packages_list: ['xinetd', 'inetd', 'ypserv', 'telnet-server', 'rsh-server', 'prelink']
os_security_packages_list: [xinetd, inetd, ypserv, telnet-server, rsh-server, prelink]
# Allow interactive startup (rhel, centos)
os_security_init_prompt: true
# Require root password for single user mode. (rhel, centos)
@@ -57,15 +63,15 @@ ufw_manage_defaults: true
# By default in Ubuntu it is set to: /etc/ufw/sysctl.conf
# CAUTION!
# If you enable it - it overwrites /etc/sysctl.conf file, managed by hardening framework
ufw_ipt_sysctl: ''
ufw_ipt_sysctl: ""
# Default ufw variables
ufw_default_input_policy: 'DROP'
ufw_default_output_policy: 'ACCEPT'
ufw_default_forward_policy: 'DROP'
ufw_default_application_policy: 'SKIP'
ufw_manage_builtins: 'no'
ufw_ipt_modules: 'nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns'
ufw_default_input_policy: DROP
ufw_default_output_policy: ACCEPT
ufw_default_forward_policy: DROP
ufw_default_application_policy: SKIP
ufw_manage_builtins: "no"
ufw_ipt_modules: nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns
# Set to true to apply rules to support IPv6 (no means only IPv6 on loopback
# accepted).
@@ -152,8 +158,8 @@ sysctl_config:
# https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace
#
# For applications launching crash handlers that need PTRACE, exceptions can
# be registered by the debugee by declaring in the segfault handler
# specifically which process will be using PTRACE on the debugee:
# be registered by the debuggee by declaring in the segfault handler
# specifically which process will be using PTRACE on the debuggee:
# prctl(PR_SET_PTRACER, debugger_pid, 0, 0, 0);
#
# In general, PTRACE is not needed for the average running Ubuntu system.
@@ -300,37 +306,39 @@ 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"
- "freevxfs"
- "jffs2"
- "hfs"
- "hfsplus"
- "squashfs"
- "udf"
- "vfat"
- cramfs
- freevxfs
- jffs2
- hfs
- hfsplus
- squashfs
- udf
- vfat
# Obsolete network protocols that should be disabled
# per CIS Oracle Linux 6 Benchmark (2016)
- "dccp" # CIS 3.5.1
- "rds" # CIS 3.5.3
- "sctp" # CIS 3.5.2
- "tipc" # CIS 3.5.4
- dccp # CIS 3.5.1
- rds # CIS 3.5.3
- sctp # CIS 3.5.2
- tipc # CIS 3.5.4
# Whitelist for used filesystems
os_filesystem_whitelist: []
# Set to false to turn the role into a no-op. Useful when using
# the Ansible role dependency mechanism.
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
@@ -338,6 +346,7 @@ os_auditd_space_left_action: SYSLOG
os_auditd_admin_space_left_action: SUSPEND
os_auditd_disk_full_action: SUSPEND
os_auditd_disk_error_action: SUSPEND
os_auditd_action_mail_acct: root
os_auditd_log_group: root
os_auditd_num_logs: 5
@@ -347,7 +356,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
@@ -393,7 +402,6 @@ os_yum_enabled: true
# List of yum repository files under /etc/yum.repos.d/ which should not be altered.
os_yum_repo_file_whitelist: []
# Set to false to disable installing and configuring apt.
os_apt_enabled: true
@@ -406,82 +414,82 @@ os_selinux_enabled: true
os_sha_crypt_min_rounds: "640000"
os_sha_crypt_max_rounds: "640000"
os_mnt_boot_dir_mode: '0700'
os_mnt_boot_dir_mode: "0700"
os_mnt_boot_enabled: false
os_mnt_boot_src: ""
os_mnt_boot_options: 'rw,nosuid,nodev,noexec'
os_mnt_boot_options: rw,nosuid,nodev,noexec
os_mnt_boot_filesystem: ""
os_mnt_boot_dump: ""
os_mnt_boot_passno: ""
os_mnt_dev_dir_mode: '0755'
os_mnt_dev_dir_mode: "0755"
os_mnt_dev_enabled: true
os_mnt_dev_src: "devtmpfs"
os_mnt_dev_options: 'rw,nosuid,noexec'
os_mnt_dev_filesystem: "devtmpfs"
os_mnt_dev_src: devtmpfs
os_mnt_dev_options: rw,nosuid,noexec
os_mnt_dev_filesystem: devtmpfs
os_mnt_dev_dump: ""
os_mnt_dev_passno: ""
os_mnt_dev_shm_dir_mode: '1777'
os_mnt_dev_shm_dir_mode: "1777"
os_mnt_dev_shm_enabled: true
os_mnt_dev_shm_src: "tmpfs"
os_mnt_dev_shm_options: 'rw,nosuid,nodev,noexec'
os_mnt_dev_shm_filesystem: "tmpfs"
os_mnt_dev_shm_src: tmpfs
os_mnt_dev_shm_options: rw,nosuid,nodev,noexec
os_mnt_dev_shm_filesystem: tmpfs
os_mnt_dev_shm_dump: ""
os_mnt_dev_shm_passno: ""
os_mnt_home_dir_mode: '0755'
os_mnt_home_dir_mode: "0755"
os_mnt_home_enabled: false
os_mnt_home_src: ""
os_mnt_home_options: 'rw,nosuid,nodev'
os_mnt_home_options: rw,nosuid,nodev
os_mnt_home_filesystem: ""
os_mnt_home_dump: ""
os_mnt_home_passno: ""
os_mnt_run_dir_mode: '0755'
os_mnt_run_dir_mode: "0755"
os_mnt_run_enabled: true
os_mnt_run_src: "tmpfs"
os_mnt_run_options: 'rw,nosuid,nodev'
os_mnt_run_filesystem: "tmpfs"
os_mnt_run_src: tmpfs
os_mnt_run_options: rw,nosuid,nodev
os_mnt_run_filesystem: tmpfs
os_mnt_run_dump: ""
os_mnt_run_passno: ""
os_mnt_tmp_dir_mode: '1777'
os_mnt_tmp_dir_mode: "1777"
os_mnt_tmp_enabled: false
os_mnt_tmp_src: ""
os_mnt_tmp_options: 'rw,nosuid,nodev,noexec'
os_mnt_tmp_options: rw,nosuid,nodev,noexec
os_mnt_tmp_filesystem: ""
os_mnt_tmp_dump: ""
os_mnt_tmp_passno: ""
os_mnt_var_dir_mode: '0755'
os_mnt_var_dir_mode: "0755"
os_mnt_var_enabled: false
os_mnt_var_src: ""
os_mnt_var_options: 'rw,nosuid,nodev'
os_mnt_var_options: rw,nosuid,nodev
os_mnt_var_filesystem: ""
os_mnt_var_dump: ""
os_mnt_var_passno: ""
os_mnt_var_log_dir_mode: '0755'
os_mnt_var_log_dir_mode: "0755"
os_mnt_var_log_enabled: false
os_mnt_var_log_src: ""
os_mnt_var_log_options: 'rw,nosuid,nodev,noexec'
os_mnt_var_log_options: rw,nosuid,nodev,noexec
os_mnt_var_log_filesystem: ""
os_mnt_var_log_dump: ""
os_mnt_var_log_passno: ""
os_mnt_var_log_audit_dir_mode: '0700'
os_mnt_var_log_audit_dir_mode: "0700"
os_mnt_var_log_audit_enabled: false
os_mnt_var_log_audit_src: ""
os_mnt_var_log_audit_options: 'rw,nosuid,nodev,noexec'
os_mnt_var_log_audit_options: rw,nosuid,nodev,noexec
os_mnt_var_log_audit_filesystem: ""
os_mnt_var_log_audit_dump: ""
os_mnt_var_log_audit_passno: ""
os_mnt_var_tmp_dir_mode: '1777'
os_mnt_var_tmp_dir_mode: "1777"
os_mnt_var_tmp_enabled: false
os_mnt_var_tmp_src: ""
os_mnt_var_tmp_options: 'rw,nosuid,nodev,noexec'
os_mnt_var_tmp_options: rw,nosuid,nodev,noexec
os_mnt_var_tmp_filesystem: ""
os_mnt_var_tmp_dump: ""
os_mnt_var_tmp_passno: ""
+5 -5
View File
@@ -1,11 +1,11 @@
---
- name: Update-initramfs
ansible.builtin.command: 'update-initramfs -u'
- name: Update-initramfs # noqa no-changed-when
ansible.builtin.command: update-initramfs -u
- name: Restart auditd
- 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 is not defined # restarting auditd in a container does not work
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:
+844
View File
@@ -0,0 +1,844 @@
---
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_extra_user_paths:
default: '[]'
type: list
description: add additional paths to the user's `PATH` variable (default is
empty).
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
+4 -3
View File
@@ -1,15 +1,16 @@
---
galaxy_info:
author: "Sebastian Gumprich"
description: 'This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.'
author: Sebastian Gumprich
description: This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
company: Hardening Framework Team
license: Apache License 2.0
min_ansible_version: '2.9.10'
min_ansible_version: "2.11"
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- name: Ubuntu
versions:
- bionic
+4 -4
View File
@@ -1,7 +1,7 @@
---
- name: Remove deprecated or insecure packages | package-01 - package-09
apt:
name: '{{ os_security_packages_list }}'
state: 'absent'
purge: 'yes'
ansible.builtin.apt:
name: "{{ os_security_packages_list }}"
state: absent
purge: true
when: os_security_packages_clean | bool
+9 -9
View File
@@ -1,16 +1,16 @@
---
- name: Install auditd package | package-08
package:
name: '{{ auditd_package }}'
state: 'present'
ansible.builtin.package:
name: "{{ auditd_package }}"
state: present
tags: auditd
- name: Configure auditd | package-08
template:
src: 'etc/audit/auditd.conf.j2'
dest: '/etc/audit/auditd.conf'
owner: 'root'
group: 'root'
mode: '0640'
ansible.builtin.template:
src: "{{ os_auditd_template }}"
dest: /etc/audit/auditd.conf
owner: root
group: root
mode: "0640"
notify: Restart auditd
tags: auditd
+1 -1
View File
@@ -6,7 +6,7 @@
# CIS 5.1.2 - CIS 5.1.7
#
- name: Find cron files and directories
find:
ansible.builtin.find:
paths:
- /etc
patterns:
+1 -1
View File
@@ -1,6 +1,6 @@
---
- name: Disable CTRL-ALT-DEL
systemd:
ansible.builtin.systemd:
name: ctrl-alt-del.target
masked: true
daemon_reload: true
+40 -30
View File
@@ -1,119 +1,129 @@
---
- name: Fetch OS dependent variables
include_vars:
file: '{{ item }}'
name: 'os_vars'
ansible.builtin.include_vars:
file: "{{ item }}"
name: os_vars
with_first_found:
- files:
- '{{ ansible_facts.distribution }}_{{ ansible_facts.distribution_major_version }}.yml'
- '{{ ansible_facts.distribution }}.yml'
- '{{ ansible_facts.os_family }}_{{ ansible_facts.distribution_major_version }}.yml'
- '{{ ansible_facts.os_family }}.yml'
- "{{ ansible_facts.distribution }}_{{ ansible_facts.distribution_major_version }}.yml"
- "{{ ansible_facts.distribution }}.yml"
- "{{ ansible_facts.os_family }}_{{ ansible_facts.distribution_major_version }}.yml"
- "{{ ansible_facts.os_family }}.yml"
skip: true
tags: always
# we only override variables with our default, if they have not been specified already
# by default the lookup functions finds all varnames containing the string, therefore
# we add ^ and $ to denote start and end of string, so this returns only exact matches
- name: Set OS dependent variables, if not already defined by user # noqa var-naming
set_fact:
'{{ item.key }}': '{{ item.value }}'
when: "not lookup('varnames', '^' + item.key + '$')"
with_dict: '{{ os_vars }}'
- name: Set OS dependent variables, if not already defined by user # noqa var-naming
ansible.builtin.set_fact:
"{{ item.key }}": "{{ item.value }}"
when: not lookup('varnames', '^' + item.key + '$')
with_dict: "{{ os_vars }}"
tags: always
- name: Import tasks for auditd
import_tasks: auditd.yml
ansible.builtin.import_tasks: auditd.yml
tags: auditd
when: os_auditd_enabled | bool
- name: Import tasks for cron
import_tasks: cron.yml
ansible.builtin.import_tasks: cron.yml
tags: cron
when: os_cron_enabled | bool
- name: Import tasks to configure ctrl+alt+del
import_tasks: ctrlaltdel.yml
ansible.builtin.import_tasks: ctrlaltdel.yml
tags: ctrlaltdel
when: os_ctrlaltdel_disabled | bool
- name: Import tasks to configure limits
import_tasks: limits.yml
ansible.builtin.import_tasks: limits.yml
tags: limits
when: os_limits_enabled | bool
- name: Import tasks to configure login_defs
import_tasks: login_defs.yml
ansible.builtin.import_tasks: login_defs.yml
tags: login_defs
when: os_login_defs_enabled | bool
- name: Import tasks to minimize access permissions
import_tasks: minimize_access.yml
ansible.builtin.import_tasks: minimize_access.yml
tags: minimize_access
when: os_minimize_access_enabled | bool
- name: Import tasks to configure PAM
import_tasks: pam.yml
ansible.builtin.import_tasks: pam.yml
tags: pam
when: os_pam_enabled | bool
- name: Import tasks to configure modules
import_tasks: modprobe.yml
ansible.builtin.import_tasks: modprobe.yml
tags: modprobe
when: os_modprobe_enabled | bool
- name: Import tasks to configure profile
import_tasks: profile.yml
ansible.builtin.import_tasks: profile.yml
tags: profile
when: os_profile_enabled | bool
- name: Import tasks to configure securetty
import_tasks: securetty.yml
ansible.builtin.import_tasks: securetty.yml
tags: securetty
when: os_securetty_enabled | bool
- name: Import tasks to set suid and sgid
import_tasks: suid_sgid.yml
ansible.builtin.import_tasks: suid_sgid.yml
when: os_security_suid_sgid_enforce | bool
tags: suid_sgid
- name: Import tasks to configure sysctl
import_tasks: sysctl.yml
ansible.builtin.import_tasks: sysctl.yml
tags: sysctl
when: os_sysctl_enabled | bool
- name: Import tasks to harden user accounts
import_tasks: user_accounts.yml
ansible.builtin.import_tasks: user_accounts.yml
tags: user_accounts
when: os_user_accounts_enabled | bool
- name: Import tasks to configure rhosts
import_tasks: rhosts.yml
ansible.builtin.import_tasks: rhosts.yml
tags: rhosts
when: os_rhosts_enabled | bool
- name: Import tasks to configure netrc
import_tasks: netrc.yml
ansible.builtin.import_tasks: netrc.yml
tags: netrc
when: os_netrc_enabled | bool
- name: Import tasks to configure yum
import_tasks: yum.yml
ansible.builtin.import_tasks: yum.yml
tags: yum
when:
- ansible_facts.os_family == 'RedHat'
- os_yum_enabled | bool
- name: Import tasks to configure apt
import_tasks: apt.yml
ansible.builtin.import_tasks: apt.yml
tags: apt
when:
- ansible_facts.os_family == 'Debian'
- os_apt_enabled | bool
- name: Import tasks to configure selinux
import_tasks: selinux.yml
ansible.builtin.import_tasks: selinux.yml
tags: selinux
when:
- ansible_facts.selinux.status == 'enabled'
- os_selinux_enabled | bool
- name: Raise deprecation warning for initramfs tasks # noqa ignore-errors
ansible.builtin.fail:
msg: "WARNING: Rebuilding initramfs is deprecated and will be removed
in the next major release. For more information take a look at this issue:
https://github.com/dev-sec/ansible-collection-hardening/pull/591"
when:
- os_security_kernel_enable_module_loading
ignore_errors: true
tags: always
+44 -43
View File
@@ -2,63 +2,64 @@
- name: Disable coredumps
when: not os_security_kernel_enable_core_dump | bool
block:
- name: Create limits.d-directory if it does not exist | sysctl-31a, sysctl-31b
file:
path: '/etc/security/limits.d'
owner: 'root'
group: 'root'
mode: '0755'
state: 'directory'
- name: Create limits.d-directory if it does not exist | sysctl-31a, sysctl-31b
ansible.builtin.file:
path: /etc/security/limits.d
owner: root
group: root
mode: "0755"
state: directory
- name: Create additional limits config file -> 10.hardcore.conf | sysctl-31a, sysctl-31b
pam_limits:
dest: '/etc/security/limits.d/10.hardcore.conf'
domain: '*'
limit_type: hard
limit_item: core
value: '0'
comment: Prevent core dumps for all users. These are usually not needed and may contain sensitive information
- name: Create additional limits config file -> 10.hardcore.conf | sysctl-31a, sysctl-31b
community.general.pam_limits:
dest: /etc/security/limits.d/10.hardcore.conf
domain: "*"
limit_type: hard
limit_item: core
value: "0"
comment: Prevent core dumps for all users. These are usually not needed and may contain sensitive information
when: not ansible_check_mode # the directory needs to be created first, which does not happen in check_mode
- name: Set 10.hardcore.conf perms to 0400 and root ownership
file:
path: /etc/security/limits.d/10.hardcore.conf
owner: 'root'
group: 'root'
mode: '0440'
state: touch
modification_time: preserve
access_time: preserve
- name: Set 10.hardcore.conf perms to 0400 and root ownership
ansible.builtin.file:
path: /etc/security/limits.d/10.hardcore.conf
owner: root
group: root
mode: "0440"
state: touch
modification_time: preserve
access_time: preserve
- name: Create coredump.conf.d-directory if it does not exist
file:
path: '/etc/systemd/coredump.conf.d'
owner: root
group: root
mode: 0755
state: directory
when: ansible_service_mgr == "systemd"
- name: Create coredump.conf.d-directory if it does not exist
ansible.builtin.file:
path: /etc/systemd/coredump.conf.d
owner: root
group: root
mode: "0755"
state: directory
when: ansible_service_mgr == "systemd"
- name: Create custom.conf for disabling coredumps
template:
src: 'etc/systemd/coredump.conf.d/coredumps.conf.j2'
dest: '/etc/systemd/coredump.conf.d/custom.conf'
owner: root
group: root
mode: 0644
when: ansible_service_mgr == "systemd"
notify: Reload systemd
- name: Create custom.conf for disabling coredumps
ansible.builtin.template:
src: etc/systemd/coredump.conf.d/coredumps.conf.j2
dest: /etc/systemd/coredump.conf.d/custom.conf
owner: root
group: root
mode: "0644"
when: ansible_service_mgr == "systemd"
notify: Reload systemd
- name: Enable coredumps
when: os_security_kernel_enable_core_dump | bool
block:
- name: Remove coredump.conf.d directory with files
file:
ansible.builtin.file:
path: /etc/systemd/coredump.conf.d
state: absent
when: ansible_service_mgr == "systemd"
notify: Reload systemd
- name: Remove 10.hardcore.conf config file
file:
ansible.builtin.file:
path: /etc/security/limits.d/10.hardcore.conf
state: absent
+6 -6
View File
@@ -1,8 +1,8 @@
---
- name: Create login.defs | os-05, os-05b
template:
src: 'etc/login.defs.j2'
dest: '/etc/login.defs'
owner: 'root'
group: 'root'
mode: '0444'
ansible.builtin.template:
src: etc/login.defs.j2
dest: /etc/login.defs
owner: root
group: root
mode: "0444"
+1 -1
View File
@@ -1,6 +1,6 @@
---
- name: Include hardening tasks
include_tasks: hardening.yml
ansible.builtin.include_tasks: hardening.yml
when: os_hardening_enabled | bool
tags:
- always
+152 -51
View File
@@ -4,103 +4,204 @@
# still getting found and the permissions minimized in the next task.
# This is also the reason why there's ignore_errors: true on the task.
# also see: https://github.com/dev-sec/ansible-os-hardening/issues/219
- name: Find files with write-permissions for group
shell: "find -L {{ item }} -perm /go+w -type f" # noqa command-instead-of-shell
- 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_extra_user_paths }}" # noqa deprecated-bare-vars
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /bin
- "{{ os_env_extra_user_paths }}"
register: minimize_access_directories
ignore_errors: true
changed_when: false
- name: Minimize access on found files
file:
path: '{{ item.1 }}'
mode: 'go-w'
ansible.builtin.file:
path: "{{ item.1 }}"
mode: go-w
state: file
with_subelements:
- "{{ minimize_access_directories.results }}"
- stdout_lines
- name: Find shadow files
stat:
ansible.builtin.stat:
path: "{{ item }}"
loop:
- '/etc/shadow'
- '/etc/gshadow'
- '/etc/shadow-'
- '/etc/gshadow-'
- /etc/shadow
- /etc/gshadow
- /etc/shadow-
- /etc/gshadow-
register: minimize_access_shadow_files
- name: Change shadow ownership to root and mode to 0600 | os-02
file:
ansible.builtin.file:
dest: "{{ item.item }}"
owner: '{{ os_shadow_perms.owner }}'
group: '{{ os_shadow_perms.group }}'
mode: '{{ os_shadow_perms.mode }}'
owner: "{{ os_shadow_perms.owner }}"
group: "{{ os_shadow_perms.group }}"
mode: "{{ os_shadow_perms.mode }}"
when: item.stat.exists
loop: "{{ minimize_access_shadow_files.results }}"
- name: Find passwd files
stat:
ansible.builtin.stat:
path: "{{ item }}"
loop:
- '/etc/passwd'
- '/etc/group'
- '/etc/passwd-'
- '/etc/group-'
- /etc/passwd
- /etc/group
- /etc/passwd-
- /etc/group-
register: minimize_access_passwd_files
- name: Change passwd ownership to root and mode to 0644 | os-03
file:
ansible.builtin.file:
dest: "{{ item.item }}"
owner: '{{ os_passwd_perms.owner }}'
group: '{{ os_passwd_perms.group }}'
mode: '{{ os_passwd_perms.mode }}'
owner: "{{ os_passwd_perms.owner }}"
group: "{{ os_passwd_perms.group }}"
mode: "{{ os_passwd_perms.mode }}"
when: item.stat.exists
loop: "{{ minimize_access_passwd_files.results }}"
- name: Change su-binary to only be accessible to user and group root
file:
dest: '/bin/su'
owner: 'root'
group: 'root'
mode: '0750'
ansible.builtin.file:
dest: /bin/su
owner: root
group: root
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
mount:
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
set_fact:
ansible.builtin.set_fact:
mountpoints_list: "{{ ansible_mounts | map(attribute='mount') | list }}"
- name: Append special devices list to valid mountpoint list
set_fact:
ansible.builtin.set_fact:
mountpoints_list: "{{ mountpoints_list + ['/dev', '/dev/shm', '/run'] }}"
- name: Minimize access for filesystems
include_tasks: minimize_access_fs.yml
loop:
- { path: '/boot', src: '{{ os_mnt_boot_src }}', fstype: '{{ os_mnt_boot_filesystem }}', opts: '{{ os_mnt_boot_options }}', enabled: "{{ os_mnt_boot_enabled }}", mode: "{{ os_mnt_boot_dir_mode }}", dump: "{{ os_mnt_boot_dump }}", passno: "{{ os_mnt_boot_passno }}" }
- { path: '/dev', src: '{{ os_mnt_dev_src }}', fstype: '{{ os_mnt_dev_filesystem }}', opts: '{{ os_mnt_dev_options }}', enabled: "{{ os_mnt_dev_enabled }}", mode: "{{ os_mnt_dev_dir_mode }}", dump: "{{ os_mnt_dev_dump }}", passno: "{{ os_mnt_dev_passno }}" }
- { path: '/dev/shm', src: '{{ os_mnt_dev_shm_src }}', fstype: '{{ os_mnt_dev_shm_filesystem }}', opts: '{{ os_mnt_dev_shm_options }}', enabled: "{{ os_mnt_dev_shm_enabled }}", mode: "{{ os_mnt_dev_shm_dir_mode }}", dump: "{{ os_mnt_dev_shm_dump }}", passno: "{{ os_mnt_dev_shm_passno }}" }
- { path: '/home', src: '{{ os_mnt_home_src }}', fstype: '{{ os_mnt_home_filesystem }}', opts: '{{ os_mnt_home_options }}', enabled: "{{ os_mnt_home_enabled }}", mode: "{{ os_mnt_home_dir_mode }}", dump: "{{ os_mnt_home_dump }}", passno: "{{ os_mnt_home_passno }}" }
- { path: '/run', src: '{{ os_mnt_run_src }}', fstype: '{{ os_mnt_run_filesystem }}', opts: '{{ os_mnt_run_options }}', enabled: "{{ os_mnt_run_enabled }}", mode: "{{ os_mnt_run_dir_mode }}", dump: "{{ os_mnt_run_dump }}", passno: "{{ os_mnt_run_passno }}" }
- { path: '/tmp', src: '{{ os_mnt_tmp_src }}', fstype: '{{ os_mnt_tmp_filesystem }}', opts: '{{ os_mnt_tmp_options }}', enabled: "{{ os_mnt_tmp_enabled }}", mode: "{{ os_mnt_tmp_dir_mode }}", dump: "{{ os_mnt_tmp_dump }}", passno: "{{ os_mnt_tmp_passno }}" }
- { path: '/var', src: '{{ os_mnt_var_src }}', fstype: '{{ os_mnt_var_filesystem }}', opts: '{{ os_mnt_var_options }}', enabled: "{{ os_mnt_var_enabled }}", mode: "{{ os_mnt_var_dir_mode }}", dump: "{{ os_mnt_var_dump }}", passno: "{{ os_mnt_var_passno }}" }
- { path: '/var/log', src: '{{ os_mnt_var_log_src }}', fstype: '{{ os_mnt_var_log_filesystem }}', opts: '{{ os_mnt_var_log_options }}', enabled: "{{ os_mnt_var_log_enabled }}", mode: "{{ os_mnt_var_log_dir_mode }}", dump: "{{ os_mnt_var_log_dump }}", passno: "{{ os_mnt_var_log_passno }}" }
- { path: '/var/log/audit', src: '{{ os_mnt_var_log_audit_src }}', fstype: '{{ os_mnt_var_log_audit_filesystem }}', opts: '{{ os_mnt_var_log_audit_options }}', enabled: "{{ os_mnt_var_log_audit_enabled }}", mode: "{{ os_mnt_var_log_audit_dir_mode }}", dump: "{{ os_mnt_var_log_audit_dump }}", passno: "{{ os_mnt_var_log_audit_passno }}" }
- { path: '/var/tmp', src: '{{ os_mnt_var_tmp_src }}', fstype: '{{ os_mnt_var_tmp_filesystem }}', opts: '{{ os_mnt_var_tmp_options }}', enabled: "{{ os_mnt_var_tmp_enabled }}", mode: "{{ os_mnt_var_tmp_dir_mode }}", dump: "{{ os_mnt_var_tmp_dump }}", passno: "{{ os_mnt_var_tmp_passno }}" }
ansible.builtin.include_tasks: minimize_access_fs.yml
loop_control:
loop_var: mount
loop:
- path: /boot
src: "{{ os_mnt_boot_src }}"
fstype: "{{ os_mnt_boot_filesystem }}"
opts: "{{ os_mnt_boot_options }}"
enabled: "{{ os_mnt_boot_enabled }}"
mode: "{{ os_mnt_boot_dir_mode }}"
group: "{{ os_mnt_boot_group }}"
owner: "{{ os_mnt_boot_owner }}"
dump: "{{ os_mnt_boot_dump }}"
passno: "{{ os_mnt_boot_passno }}"
- path: /dev
src: "{{ os_mnt_dev_src }}"
fstype: "{{ os_mnt_dev_filesystem }}"
opts: "{{ os_mnt_dev_options }}"
enabled: "{{ os_mnt_dev_enabled }}"
mode: "{{ os_mnt_dev_dir_mode }}"
group: "{{ os_mnt_dev_group }}"
owner: "{{ os_mnt_dev_owner }}"
dump: "{{ os_mnt_dev_dump }}"
passno: "{{ os_mnt_dev_passno }}"
- path: /dev/shm
src: "{{ os_mnt_dev_shm_src }}"
fstype: "{{ os_mnt_dev_shm_filesystem }}"
opts: "{{ os_mnt_dev_shm_options }}"
enabled: "{{ os_mnt_dev_shm_enabled }}"
mode: "{{ os_mnt_dev_shm_dir_mode }}"
group: "{{ os_mnt_dev_shm_group }}"
owner: "{{ os_mnt_dev_shm_owner }}"
dump: "{{ os_mnt_dev_shm_dump }}"
passno: "{{ os_mnt_dev_shm_passno }}"
- path: /home
src: "{{ os_mnt_home_src }}"
fstype: "{{ os_mnt_home_filesystem }}"
opts: "{{ os_mnt_home_options }}"
enabled: "{{ os_mnt_home_enabled }}"
mode: "{{ os_mnt_home_dir_mode }}"
group: "{{ os_mnt_home_group }}"
owner: "{{ os_mnt_home_owner }}"
dump: "{{ os_mnt_home_dump }}"
passno: "{{ os_mnt_home_passno }}"
- path: /run
src: "{{ os_mnt_run_src }}"
fstype: "{{ os_mnt_run_filesystem }}"
opts: "{{ os_mnt_run_options }}"
enabled: "{{ os_mnt_run_enabled }}"
mode: "{{ os_mnt_run_dir_mode }}"
group: "{{ os_mnt_run_group }}"
owner: "{{ os_mnt_run_owner }}"
dump: "{{ os_mnt_run_dump }}"
passno: "{{ os_mnt_run_passno }}"
- path: /tmp
src: "{{ os_mnt_tmp_src }}"
fstype: "{{ os_mnt_tmp_filesystem }}"
opts: "{{ os_mnt_tmp_options }}"
enabled: "{{ os_mnt_tmp_enabled }}"
mode: "{{ os_mnt_tmp_dir_mode }}"
group: "{{ os_mnt_tmp_group }}"
owner: "{{ os_mnt_tmp_owner }}"
dump: "{{ os_mnt_tmp_dump }}"
passno: "{{ os_mnt_tmp_passno }}"
- path: /var
src: "{{ os_mnt_var_src }}"
fstype: "{{ os_mnt_var_filesystem }}"
opts: "{{ os_mnt_var_options }}"
enabled: "{{ os_mnt_var_enabled }}"
mode: "{{ os_mnt_var_dir_mode }}"
group: "{{ os_mnt_var_group }}"
owner: "{{ os_mnt_var_owner }}"
dump: "{{ os_mnt_var_dump }}"
passno: "{{ os_mnt_var_passno }}"
- path: /var/log
src: "{{ os_mnt_var_log_src }}"
fstype: "{{ os_mnt_var_log_filesystem }}"
opts: "{{ os_mnt_var_log_options }}"
enabled: "{{ os_mnt_var_log_enabled }}"
mode: "{{ os_mnt_var_log_dir_mode }}"
group: "{{ os_mnt_var_log_group }}"
owner: "{{ os_mnt_var_log_owner }}"
dump: "{{ os_mnt_var_log_dump }}"
passno: "{{ os_mnt_var_log_passno }}"
- path: /var/log/audit
src: "{{ os_mnt_var_log_audit_src }}"
fstype: "{{ os_mnt_var_log_audit_filesystem }}"
opts: "{{ os_mnt_var_log_audit_options }}"
enabled: "{{ os_mnt_var_log_audit_enabled }}"
mode: "{{ os_mnt_var_log_audit_dir_mode }}"
group: "{{ os_mnt_var_log_audit_group }}"
owner: "{{ os_mnt_var_log_audit_owner }}"
dump: "{{ os_mnt_var_log_audit_dump }}"
passno: "{{ os_mnt_var_log_audit_passno }}"
- path: /var/tmp
src: "{{ os_mnt_var_tmp_src }}"
fstype: "{{ os_mnt_var_tmp_filesystem }}"
opts: "{{ os_mnt_var_tmp_options }}"
enabled: "{{ os_mnt_var_tmp_enabled }}"
mode: "{{ os_mnt_var_tmp_dir_mode }}"
group: "{{ os_mnt_var_tmp_group }}"
owner: "{{ os_mnt_var_tmp_owner }}"
dump: "{{ os_mnt_var_tmp_dump }}"
passno: "{{ os_mnt_var_tmp_passno }}"
Loaded 100 of 153 files, more files were not shown because too many files have changed in this diff. Show more