mirror of
https://github.com/ansible-collections/ansible.posix.git
synced 2026-07-25 08:55:00 +00:00
Compare commits
6 Commits
78fb77c8d5
...
2.2.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e98d9a0756 | ||
|
|
73939ba8ff | ||
|
|
2504f532b8 | ||
|
|
4ac4603af5 | ||
|
|
a4805b92b7 | ||
|
|
ee1461f46c |
@@ -4,7 +4,6 @@
|
|||||||
# SPDX-FileCopyrightText: 2024, Ansible Project
|
# SPDX-FileCopyrightText: 2024, Ansible Project
|
||||||
|
|
||||||
skip_list:
|
skip_list:
|
||||||
- meta-runtime[unsupported-version] # This rule doesn't make any sense
|
|
||||||
- fqcn[deep] # This rule produces false positives for files in tests/unit/plugins/action/fixtures/
|
- fqcn[deep] # This rule produces false positives for files in tests/unit/plugins/action/fixtures/
|
||||||
- sanity[cannot-ignore] # This rule is skipped to keep backward compatibility with Python 2
|
- sanity[cannot-ignore] # This rule is skipped to keep backward compatibility with Python 2
|
||||||
|
|
||||||
|
|||||||
@@ -271,10 +271,10 @@ stages:
|
|||||||
parameters:
|
parameters:
|
||||||
testFormat: devel/{0}/1
|
testFormat: devel/{0}/1
|
||||||
targets:
|
targets:
|
||||||
- name: RHEL 10.1
|
- name: RHEL 10.2
|
||||||
test: rhel/10.1
|
test: rhel/10.2
|
||||||
- name: RHEL 9.7
|
- name: RHEL 9.8
|
||||||
test: rhel/9.7
|
test: rhel/9.8
|
||||||
- name: FreeBSD 14.4
|
- name: FreeBSD 14.4
|
||||||
test: freebsd/14.4
|
test: freebsd/14.4
|
||||||
- name: FreeBSD 15.0
|
- name: FreeBSD 15.0
|
||||||
|
|||||||
@@ -4,6 +4,43 @@ ansible.posix Release Notes
|
|||||||
|
|
||||||
.. contents:: Topics
|
.. contents:: Topics
|
||||||
|
|
||||||
|
v2.2.2
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the minor release of the ``ansible.posix`` collection.
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
in the stable-2 branch that have been added after the release of
|
||||||
|
``ansible.posix`` 2.2.1
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- README - Added ``Red Hat Automation Hub`` as correct contact information for Red Hat Ansible Automation Platform subscribers.
|
||||||
|
|
||||||
|
v2.2.1
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the minor release of the ``ansible.posix`` collection.
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
in the stable-2 branch that have been added after the release of
|
||||||
|
``ansible.posix`` 2.2.0
|
||||||
|
|
||||||
|
Security Fixes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
- authorized_key - fix local privilege escalation via symlink-following when running as root (https://github.com/ansible-collections/ansible.posix/issues/759).
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- sysctl - reload sysctl only if the sysctl file is ``/etc/sysctl.conf`` or ``/etc/sysctl.conf.local`` (https://github.com/ansible-collections/ansible.posix/issues/663).
|
||||||
|
|
||||||
v2.2.0
|
v2.2.0
|
||||||
======
|
======
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,8 @@ We welcome community contributions to this collection. For more details, see [Co
|
|||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
See [Communication](#Communication) section.
|
* Community users can find help through the [Communication](#Communication) section.
|
||||||
|
* Red Hat Ansible Automation Platform subscribers can request support through [Automation Hub](https://console.redhat.com/ansible/automation-hub/collections/published/ansible/posix/) by using the "Create issue" button on the collection page.
|
||||||
|
|
||||||
## Release Notes and Roadmap
|
## Release Notes and Roadmap
|
||||||
|
|
||||||
|
|||||||
@@ -578,3 +578,44 @@ releases:
|
|||||||
- firewalld_info_warnings.yml
|
- firewalld_info_warnings.yml
|
||||||
- patch_removed.yml
|
- patch_removed.yml
|
||||||
release_date: '2026-05-18'
|
release_date: '2026-05-18'
|
||||||
|
2.2.1:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- sysctl - reload sysctl only if the sysctl file is ``/etc/sysctl.conf`` or
|
||||||
|
``/etc/sysctl.conf.local`` (https://github.com/ansible-collections/ansible.posix/issues/663).
|
||||||
|
release_summary: 'This is the minor release of the ``ansible.posix`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
|
||||||
|
in the stable-2 branch that have been added after the release of
|
||||||
|
|
||||||
|
``ansible.posix`` 2.2.0'
|
||||||
|
security_fixes:
|
||||||
|
- authorized_key - fix local privilege escalation via symlink-following when
|
||||||
|
running as root (https://github.com/ansible-collections/ansible.posix/issues/759).
|
||||||
|
fragments:
|
||||||
|
- 2.2.1.yml
|
||||||
|
- 643-sysctl-docs.yml
|
||||||
|
- 751_ci_test_container_update.yml
|
||||||
|
- 755_ci_test_container_update.yml
|
||||||
|
- 759_cve_2026_11837.yml
|
||||||
|
- 763_ci_azp_update_devel.yml
|
||||||
|
- freebsd_sysctl.yml
|
||||||
|
release_date: '2026-07-01'
|
||||||
|
2.2.2:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- README - Added ``Red Hat Automation Hub`` as correct contact information for
|
||||||
|
Red Hat Ansible Automation Platform subscribers.
|
||||||
|
release_summary: 'This is the minor release of the ``ansible.posix`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
|
||||||
|
in the stable-2 branch that have been added after the release of
|
||||||
|
|
||||||
|
``ansible.posix`` 2.2.1'
|
||||||
|
fragments:
|
||||||
|
- 2.2.2.yml
|
||||||
|
- 767_remove_unsupported_version_skip.yml
|
||||||
|
- 768_update_support_section.yml
|
||||||
|
release_date: '2026-07-08'
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
trivial:
|
|
||||||
- sysctl - added the attributes section to the module documentation to reflect check_mode support (https://github.com/ansible-collections/ansible.posix/issues/643).
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
trivial:
|
|
||||||
- Update Azure Pipelines test container to 8.0.0 and use legacy container for ansible-core 2.16/2.17.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
trivial:
|
|
||||||
- Replace AZP remote test FreeBSD-14.2 with 14.3 for Ansible Core 2.19.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
bugfixes:
|
|
||||||
- sysctl - reload sysctl only if the sysctl file is ``/etc/sysctl.conf`` or ``/etc/sysctl.conf.local`` (https://github.com/ansible-collections/ansible.posix/issues/663).
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
namespace: ansible
|
namespace: ansible
|
||||||
name: posix
|
name: posix
|
||||||
version: 2.2.0
|
version: 2.2.2
|
||||||
readme: README.md
|
readme: README.md
|
||||||
authors:
|
authors:
|
||||||
- Ansible (github.com/ansible)
|
- Ansible (github.com/ansible)
|
||||||
|
|||||||
@@ -307,6 +307,17 @@ class keydict(dict):
|
|||||||
return [item[1] for item in self.items()]
|
return [item[1] for item in self.items()]
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_open_write(module, path, follow):
|
||||||
|
flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
|
||||||
|
if not follow and hasattr(os, 'O_NOFOLLOW'):
|
||||||
|
flags |= os.O_NOFOLLOW
|
||||||
|
try:
|
||||||
|
fd = os.open(path, flags, int('0600', 8))
|
||||||
|
except OSError as e:
|
||||||
|
module.fail_json(msg="File open failed %s : %s" % (path, to_native(e)))
|
||||||
|
return fd
|
||||||
|
|
||||||
|
|
||||||
def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False):
|
def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False):
|
||||||
"""
|
"""
|
||||||
Calculate name of authorized keys file, optionally creating the
|
Calculate name of authorized keys file, optionally creating the
|
||||||
@@ -359,7 +370,7 @@ def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False)
|
|||||||
module.fail_json(msg="Failed to create directory %s : %s" % (sshdir, to_native(e)))
|
module.fail_json(msg="Failed to create directory %s : %s" % (sshdir, to_native(e)))
|
||||||
if module.selinux_enabled():
|
if module.selinux_enabled():
|
||||||
module.set_default_selinux_context(sshdir, False)
|
module.set_default_selinux_context(sshdir, False)
|
||||||
os.chown(sshdir, uid, gid)
|
os.chown(sshdir, uid, gid, follow_symlinks=follow)
|
||||||
os.chmod(sshdir, int('0700', 8))
|
os.chmod(sshdir, int('0700', 8))
|
||||||
|
|
||||||
if not os.path.exists(keysfile):
|
if not os.path.exists(keysfile):
|
||||||
@@ -367,16 +378,13 @@ def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False)
|
|||||||
if not os.path.exists(basedir):
|
if not os.path.exists(basedir):
|
||||||
os.makedirs(basedir)
|
os.makedirs(basedir)
|
||||||
|
|
||||||
f = None
|
fd = _safe_open_write(module, keysfile, follow)
|
||||||
try:
|
os.close(fd)
|
||||||
f = open(keysfile, "w") # touches file so we can set ownership and perms
|
|
||||||
finally:
|
|
||||||
f.close()
|
|
||||||
if module.selinux_enabled():
|
if module.selinux_enabled():
|
||||||
module.set_default_selinux_context(keysfile, False)
|
module.set_default_selinux_context(keysfile, False)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.chown(keysfile, uid, gid)
|
os.chown(keysfile, uid, gid, follow_symlinks=follow)
|
||||||
os.chmod(keysfile, int('0600', 8))
|
os.chmod(keysfile, int('0600', 8))
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
@@ -607,7 +615,7 @@ def enforce_state(module, params):
|
|||||||
|
|
||||||
# check current state -- just get the filename, don't create file
|
# check current state -- just get the filename, don't create file
|
||||||
do_write = False
|
do_write = False
|
||||||
params["keyfile"] = keyfile(module, user, do_write, path, manage_dir)
|
params["keyfile"] = keyfile(module, user, do_write, path, manage_dir, follow)
|
||||||
existing_content = readfile(module, params["keyfile"])
|
existing_content = readfile(module, params["keyfile"])
|
||||||
existing_keys = parsekeys(module, existing_content)
|
existing_keys = parsekeys(module, existing_content)
|
||||||
|
|
||||||
@@ -696,6 +704,11 @@ def enforce_state(module, params):
|
|||||||
|
|
||||||
if not module.check_mode:
|
if not module.check_mode:
|
||||||
writefile(module, filename, new_content)
|
writefile(module, filename, new_content)
|
||||||
|
user_entry = pwd.getpwnam(user)
|
||||||
|
uid = user_entry.pw_uid
|
||||||
|
gid = user_entry.pw_gid
|
||||||
|
os.chown(filename, uid, gid, follow_symlinks=follow)
|
||||||
|
os.chmod(filename, int('0600', 8))
|
||||||
params['changed'] = True
|
params['changed'] = True
|
||||||
|
|
||||||
return params
|
return params
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
#
|
||||||
|
# Check: keysfile is symlink and follow=false
|
||||||
|
#
|
||||||
|
- name: Try to add key with keysfile as symlink
|
||||||
|
ansible.posix.authorized_key:
|
||||||
|
user: testuser
|
||||||
|
key: "{{ rsa_key_basic }}"
|
||||||
|
state: present
|
||||||
|
manage_dir: false
|
||||||
|
follow: false
|
||||||
|
|
||||||
|
- name: Assert target file ownership unchanged
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /tmp/symlink_test_target/target_file
|
||||||
|
register: target_file_stat
|
||||||
|
|
||||||
|
- name: Verify target file is still owned by root
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- target_file_stat.stat.uid == 0
|
||||||
|
...
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
- name: Remove testuser
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: testuser
|
||||||
|
state: absent
|
||||||
|
remove: true
|
||||||
|
|
||||||
|
- name: Remove symlink target directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /tmp/symlink_test_target
|
||||||
|
state: absent
|
||||||
|
...
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
- name: Create testuser for symlink tests
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: testuser
|
||||||
|
create_home: true
|
||||||
|
register: testuser_result
|
||||||
|
|
||||||
|
- name: Create symlink target directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /tmp/symlink_test_target
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
mode: '0700'
|
||||||
|
|
||||||
|
- name: Create a target file owned by root
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /tmp/symlink_test_target/target_file
|
||||||
|
content: "sensitive data"
|
||||||
|
owner: root
|
||||||
|
mode: '0600'
|
||||||
|
|
||||||
|
- name: Remove .ssh directory if exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ testuser_result.home }}/.ssh"
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Create .ssh directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ testuser_result.home }}/.ssh"
|
||||||
|
state: directory
|
||||||
|
mode: '0700'
|
||||||
|
|
||||||
|
- name: Create symlink from authorized_keys to target file
|
||||||
|
ansible.builtin.file:
|
||||||
|
src: /tmp/symlink_test_target/target_file
|
||||||
|
dest: "{{ testuser_result.home }}/.ssh/authorized_keys"
|
||||||
|
state: link
|
||||||
|
...
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
- name: Setup testing environment
|
- name: Setup for testing environment
|
||||||
ansible.builtin.import_tasks: setup_steps.yml
|
ansible.builtin.import_tasks: setup_steps.yml
|
||||||
|
|
||||||
- name: Test for multiple keys handling
|
- name: Test for multiple keys handling
|
||||||
@@ -37,3 +37,12 @@
|
|||||||
|
|
||||||
- name: Test for permission denied files
|
- name: Test for permission denied files
|
||||||
ansible.builtin.import_tasks: check_permissions.yml
|
ansible.builtin.import_tasks: check_permissions.yml
|
||||||
|
|
||||||
|
- name: CVE-2026-11837 Setup for symlink tests
|
||||||
|
ansible.builtin.import_tasks: check_symlink_setup.yml
|
||||||
|
|
||||||
|
- name: CVE-2026-11837 Test for symlink tests
|
||||||
|
ansible.builtin.import_tasks: check_symlink.yml
|
||||||
|
|
||||||
|
- name: CVE-2026-11837 Cleanup symlink test
|
||||||
|
ansible.builtin.import_tasks: check_symlink_cleanup.yml
|
||||||
|
|||||||
Reference in New Issue
Block a user