* Mon May 27 2024 Miroslav Rezanina <mrezanin@redhat.com> - 24.1.4-5
- ci-feat-Set-RH-ssh-key-permissions-when-no-ssh_keys-gro.patch [RHEL-36456] - Resolves: RHEL-36456 ([RHEL-10] Group ssh_keys is missing and ssh host key permission is changed in rhel-10)
This commit is contained in:
parent
f5bbce6e97
commit
28d4c4ad66
147
ci-feat-Set-RH-ssh-key-permissions-when-no-ssh_keys-gro.patch
Normal file
147
ci-feat-Set-RH-ssh-key-permissions-when-no-ssh_keys-gro.patch
Normal file
@ -0,0 +1,147 @@
|
||||
From 1a2f6a3e17aff53bcc239d66b7095ea0441b5d7b Mon Sep 17 00:00:00 2001
|
||||
From: Ani Sinha <anisinha@redhat.com>
|
||||
Date: Tue, 21 May 2024 03:04:06 +0530
|
||||
Subject: [PATCH] feat: Set RH ssh key permissions when no 'ssh_keys' group
|
||||
(#5296)
|
||||
|
||||
RH-Author: Ani Sinha <anisinha@redhat.com>
|
||||
RH-MergeRequest: 83: feat: Set RH ssh key permissions when no 'ssh_keys' group (#5296)
|
||||
RH-Jira: RHEL-36456
|
||||
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
||||
RH-Acked-by: Cathy Avery <cavery@redhat.com>
|
||||
RH-Commit: [1/1] d32c2c56227903cc00d3f807500e8cbda478b5c8 (anisinha/cloud-init)
|
||||
|
||||
Fedora core 38 and above, centos 10 stream and all distributions derived from
|
||||
them do not have the group 'ssh_keys'. Please see the fedora rawhide change
|
||||
https://src.fedoraproject.org/rpms/openssh/c/7a21555354a2c5e724aa4c287b640c24bf108780?branch=rawhide
|
||||
|
||||
In those distributions, openssh versions are 9 and above. The private
|
||||
key permissions are set as 0o600 and the public key permissions are set as
|
||||
0o644 from sshd-keygen utility. The 'root' group owns the keys.
|
||||
Please see
|
||||
https://src.fedoraproject.org/rpms/openssh/c/b615362fd0b4da657d624571441cb74983de6e3f?branch=rawhide
|
||||
|
||||
In older releases where 'ssh_keys' group is present, the private key
|
||||
permissions are set as 0o640. Public key permissions are 0o644. These
|
||||
releases have openssh version less than 9.
|
||||
|
||||
Since cloud-init generates the keys and not the sshd-genkey utility,
|
||||
permissions must be set accordingly for cloud-init generated public and
|
||||
private keys for all cases. This includes cases where 'ssh_keys' group is
|
||||
absent. This change fixes this. The code has been reworked a little
|
||||
bit so as to simplify things. Unit tests have been adjusted accordingly.
|
||||
|
||||
Signed-off-by: Ani Sinha <anisinha@redhat.com>
|
||||
(cherry picked from commit 23136e6a94821320a85117a2e4c4bb9b0926541f)
|
||||
---
|
||||
cloudinit/config/cc_ssh.py | 48 +++++++++++++++++++++------
|
||||
tests/unittests/config/test_cc_ssh.py | 15 ++++-----
|
||||
2 files changed, 45 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/cloudinit/config/cc_ssh.py b/cloudinit/config/cc_ssh.py
|
||||
index f69e49c1..d44e1302 100644
|
||||
--- a/cloudinit/config/cc_ssh.py
|
||||
+++ b/cloudinit/config/cc_ssh.py
|
||||
@@ -184,6 +184,42 @@ for k in GENERATE_KEY_NAMES:
|
||||
KEY_GEN_TPL = 'o=$(ssh-keygen -yf "%s") && echo "$o" root@localhost > "%s"'
|
||||
|
||||
|
||||
+def set_redhat_keyfile_perms(keyfile: str) -> None:
|
||||
+ """
|
||||
+ For fedora 37, centos 9 stream and below:
|
||||
+ - sshd version is earlier than version 9.
|
||||
+ - 'ssh_keys' group is present and owns the private keys.
|
||||
+ - private keys have permission 0o640.
|
||||
+ For fedora 38, centos 10 stream and above:
|
||||
+ - ssh version is atleast version 9.
|
||||
+ - 'ssh_keys' group is absent. 'root' group owns the keys.
|
||||
+ - private keys have permission 0o600, same as upstream.
|
||||
+ Public keys in all cases have permission 0o644.
|
||||
+ """
|
||||
+ permissions_public = 0o644
|
||||
+ ssh_version = ssh_util.get_opensshd_upstream_version()
|
||||
+ if ssh_version and ssh_version < util.Version(9, 0):
|
||||
+ # fedora 37, centos 9 stream and below has sshd
|
||||
+ # versions less than 9 and private key permissions are
|
||||
+ # set to 0o640 from sshd-keygen.
|
||||
+ # See sanitize permissions" section in sshd-keygen.
|
||||
+ permissions_private = 0o640
|
||||
+ else:
|
||||
+ # fedora 38, centos 10 stream and above. sshd-keygen sets
|
||||
+ # private key persmissions to 0o600.
|
||||
+ permissions_private = 0o600
|
||||
+
|
||||
+ gid = util.get_group_id("ssh_keys")
|
||||
+ if gid != -1:
|
||||
+ # 'ssh_keys' group exists for fedora 37, centos 9 stream
|
||||
+ # and below. On these distros, 'ssh_keys' group own the private
|
||||
+ # keys. When 'ssh_keys' group is absent for newer distros,
|
||||
+ # 'root' group owns the private keys which is the default.
|
||||
+ os.chown(keyfile, -1, gid)
|
||||
+ os.chmod(keyfile, permissions_private)
|
||||
+ os.chmod(f"{keyfile}.pub", permissions_public)
|
||||
+
|
||||
+
|
||||
def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None:
|
||||
|
||||
# remove the static keys from the pristine image
|
||||
@@ -280,16 +316,8 @@ def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None:
|
||||
):
|
||||
sys.stdout.write(util.decode_binary(out))
|
||||
|
||||
- gid = util.get_group_id("ssh_keys")
|
||||
- if gid != -1:
|
||||
- # perform same "sanitize permissions" as sshd-keygen
|
||||
- permissions_private = 0o600
|
||||
- ssh_version = ssh_util.get_opensshd_upstream_version()
|
||||
- if ssh_version and ssh_version < util.Version(9, 0):
|
||||
- permissions_private = 0o640
|
||||
- os.chown(keyfile, -1, gid)
|
||||
- os.chmod(keyfile, permissions_private)
|
||||
- os.chmod(f"{keyfile}.pub", 0o644)
|
||||
+ if cloud.distro.osfamily == "redhat":
|
||||
+ set_redhat_keyfile_perms(keyfile)
|
||||
except subp.ProcessExecutionError as e:
|
||||
err = util.decode_binary(e.stderr).lower()
|
||||
if e.exit_code == 1 and err.lower().startswith(
|
||||
diff --git a/tests/unittests/config/test_cc_ssh.py b/tests/unittests/config/test_cc_ssh.py
|
||||
index 102519eb..49327bb6 100644
|
||||
--- a/tests/unittests/config/test_cc_ssh.py
|
||||
+++ b/tests/unittests/config/test_cc_ssh.py
|
||||
@@ -307,7 +307,7 @@ class TestHandleSsh:
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"ssh_keys_group_exists,sshd_version,expected_private_permissions",
|
||||
- [(False, 0, 0), (True, 8, 0o640), (True, 10, 0o600)],
|
||||
+ [(False, 9, 0o600), (True, 8, 0o640), (True, 10, 0o600)],
|
||||
)
|
||||
@mock.patch(MODPATH + "subp.subp", return_value=("", ""))
|
||||
@mock.patch(MODPATH + "util.get_group_id", return_value=10)
|
||||
@@ -336,18 +336,17 @@ class TestHandleSsh:
|
||||
m_gid.return_value = 10 if ssh_keys_group_exists else -1
|
||||
m_sshd_version.return_value = util.Version(sshd_version, 0)
|
||||
key_path = cc_ssh.KEY_FILE_TPL % "rsa"
|
||||
- cloud = get_cloud(distro="ubuntu")
|
||||
+ cloud = get_cloud(distro="centos")
|
||||
cc_ssh.handle("name", {"ssh_genkeytypes": ["rsa"]}, cloud, [])
|
||||
if ssh_keys_group_exists:
|
||||
m_chown.assert_called_once_with(key_path, -1, 10)
|
||||
- assert m_chmod.call_args_list == [
|
||||
- mock.call(key_path, expected_private_permissions),
|
||||
- mock.call(f"{key_path}.pub", 0o644),
|
||||
- ]
|
||||
else:
|
||||
- m_sshd_version.assert_not_called()
|
||||
m_chown.assert_not_called()
|
||||
- m_chmod.assert_not_called()
|
||||
+
|
||||
+ assert m_chmod.call_args_list == [
|
||||
+ mock.call(key_path, expected_private_permissions),
|
||||
+ mock.call(f"{key_path}.pub", 0o644),
|
||||
+ ]
|
||||
|
||||
@pytest.mark.parametrize("with_sshd_dconf", [False, True])
|
||||
@mock.patch(MODPATH + "util.ensure_dir")
|
||||
--
|
||||
2.39.3
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Name: cloud-init
|
||||
Version: 24.1.4
|
||||
Release: 4%{?dist}
|
||||
Release: 5%{?dist}
|
||||
Summary: Cloud instance init scripts
|
||||
License: Apache-2.0 OR GPL-3.0-only
|
||||
URL: https://github.com/canonical/cloud-init
|
||||
@ -23,6 +23,8 @@ Patch6: ci-fix-Fall-back-to-cached-local-ds-if-no-valid-ds-foun.patch
|
||||
Patch7: ci-refactor-remove-dependency-on-netifaces-4634.patch
|
||||
# For RHEL-34518 - Remove dependency to netifcaces
|
||||
Patch8: ci-DS-VMware-Fix-ipv6-addr-converter-from-netinfo-to-ne.patch
|
||||
# For RHEL-36456 - [RHEL-10] Group ssh_keys is missing and ssh host key permission is changed in rhel-10
|
||||
Patch9: ci-feat-Set-RH-ssh-key-permissions-when-no-ssh_keys-gro.patch
|
||||
|
||||
BuildArch: noarch
|
||||
|
||||
@ -227,6 +229,11 @@ fi
|
||||
|
||||
|
||||
%changelog
|
||||
* Mon May 27 2024 Miroslav Rezanina <mrezanin@redhat.com> - 24.1.4-5
|
||||
- ci-feat-Set-RH-ssh-key-permissions-when-no-ssh_keys-gro.patch [RHEL-36456]
|
||||
- Resolves: RHEL-36456
|
||||
([RHEL-10] Group ssh_keys is missing and ssh host key permission is changed in rhel-10)
|
||||
|
||||
* Mon May 06 2024 Miroslav Rezanina <mrezanin@redhat.com> - 24.1.4-4
|
||||
- ci-Report-full-specific-version-with-cloud-init-version.patch [RHEL-34764]
|
||||
- Resolves: RHEL-34764
|
||||
|
Loading…
Reference in New Issue
Block a user