name : cc_ssh.cpython-39.pyc
a

'�Dg,�
@s�UdZddlZddlZddlZddlZddlZddlmZmZm	Z	ddl
mZmZm
Z
mZddlmZddlmZddlmZddlmZmZdd	lmZd
egegd�Zeed<e�e�Zgd
�ZdgZ e�!d�Z"dZ#dZ$gZ%ee&ed<iZ'iZ(eD]dZ)e'�*e)�d�e#e)dfe)�d�e#e)�d�dfe)�d�e#e)�d�dfi�e)�d�e(e)�d�<q�dZ+e&dd�dd�Z,e&eee-dd�dd �Z.d!d"�Z/d&ee	e&d#�d$d%�Z0dS)'zSSH: Configure SSH and SSH keys�N)�List�Optional�Sequence)�	lifecycle�ssh_util�subp�util)�Cloud)�Config)�
MetaSchema)�ALL_DISTROS�ug_util)�PER_INSTANCEZcc_ssh)�idZdistrosZ	frequencyZactivate_by_schema_keys�meta)ZrsaZecdsa�ed25519rz4^(ecdsa-sk|ed25519-sk)_(private|public|certificate)$z/etc/ssh/ssh_host_%s_keyT�HOST_KEY_PUBLISH_BLACKLISTZ_private�Z_public�.pub��_certificatez	-cert.pubz;o=$(ssh-keygen -yf "%s") && echo "$o" root@localhost > "%s")�keyfile�returncCsld}t��}|r&|t�dd�kr&d}nd}t�d�}|dkrJt�|d|�t�||�t�|�d�|�d	S)
a�
    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.
    r�	ri�r�ssh_keys���rN)	rZget_opensshd_upstream_versionrZVersionrZget_group_id�os�chown�chmod)rZpermissions_publicZssh_versionZpermissions_private�gid�r �;/usr/lib/python3.9/site-packages/cloudinit/config/cc_ssh.py�set_redhat_keyfile_perms@s
r")�name�cfg�cloud�argsrc$Cs�|�dd�rZtj�dd�}t�|�D]4}zt�|�Wq$tyVt�t	d|�Yq$0q$d|v�r�g}|d�
�D]t\}}|tvr�t�
|�r�d}	nd}	t	�d	|	|�qtt|d
}
t|d}t�|
||�d|vrt|�d
t|
�f�qt|r�t�|�t�
�D]�\}}
|
|dv�s||dv�r(�qt|d
t|
d
}}ddt||fg}zPtjddd��tj|dd�Wd�n1�s�0Yt	�d||�Wn,t�y�t�t	d|�d|���Yn0�q�n�t�|dt�}t���s�|ndd�|D�}t|��|�}|�r*t	�dd�|��|D�]<}t|}tj�|��rN�q.t� tj�!|��dd|ddd |g}tjddd���zTtj|dd!d"id#�\}}t�"|d$d��s�t#j$�%t�&|��|j'j(d%k�r�t)|�Wnrtj*�yH}zVt�&|j+��,�}|j-dk�r$|�,��.d&��r$t	�d'|�nt�t	d(||�WYd}~n
d}~00Wd�n1�s`0Y�q.d)|v�r�t�|d)d*t/�}t�"|d)d+t0�}nt/}t0}|�r�t1|d,�}z|j2�3|�Wn t�y�t�t	d-�Yn0z�t4�5||j'�\}}t4�6|�\}}t�"|d.d�} t�7|d/tj8�}!g}"t�"|d0d��rL|�9��pHg}"n
t	�d1�d2|v�rr|d2}#|"�:|#�t;|"|| |!�Wn t�y�t�t	d3�Yn0dS)4NZssh_deletekeysTz	/etc/ssh/zssh_host_*key*zFailed deleting key file %srZunsupportedZunrecognizedz Skipping %s ssh_keys entry: "%s"r�rZHostCertificate�shz-xcz/etc/ssh)�	recursiveF)�capturezGenerated a key for %s from %szFailed generating a key for z from Zssh_genkeytypescSsg|]}|tvr|�qSr )�FIPS_UNSUPPORTED_KEY_NAMES)�.0�namesr r r!�
<listcomp>�s�zhandle.<locals>.<listcomp>z5skipping keys that are not supported in fips mode: %s�,z
ssh-keygenz-tz-N�z-f�LANG�C)r*Z
update_envZssh_quiet_keygenZredhatzunknown keyz!ssh-keygen: unknown key type '%s'z(Failed generating key type %s to file %sZssh_publish_hostkeys�	blacklistZenabled�r3zPublishing host keys failed!�disable_root�disable_root_optsZallow_public_ssh_keyszSSkipping import of publish SSH keys per config setting: allow_public_ssh_keys=FalseZssh_authorized_keysz Applying SSH credentials failed!)<�getr�path�join�globrZdel_file�	ExceptionZlogexc�LOG�items�CONFIG_KEY_TO_FILE�pattern_unsupported_config_keys�matchZwarningZ
write_file�append�strrZappend_ssh_config�PRIV_TO_PUB�KEY_GEN_TPLZSeLinuxGuardr�debugZget_cfg_option_list�GENERATE_KEY_NAMESZfips_enabled�set�
difference�KEY_FILE_TPL�existsZ
ensure_dir�dirnameZget_cfg_option_bool�sys�stdout�writeZ
decode_binaryZdistroZosfamilyr"ZProcessExecutionError�stderr�lowerZ	exit_code�
startswithr�PUBLISH_HOST_KEYS�get_public_host_keysZ
datasourceZpublish_host_keysr
Znormalize_users_groupsZextract_defaultZget_cfg_option_strZDISABLE_USER_OPTSZget_public_ssh_keys�extend�apply_credentials)$r#r$r%r&Zkey_pth�fZcert_config�key�val�reasonZtgt_fnZ	tgt_permsZprivate_typeZpublic_typeZprivate_fileZpublic_file�cmdZgenkeysZ	key_namesZskipped_keysZkeytyper�out�err�eZhost_key_blacklistZpublish_hostkeysZhostkeysZusersZ_groups�userZ_user_configr5r6�keysZcfgkeysr r r!�handleds



�
�

�.��������	�

�
���>
�
�
��

r`cCsVt|�}|rt�||�|r>|s$d}|�d|�}|�dd�}nd}tj|d|d�dS)NZNONEz$USERz
$DISABLE_USER�rootr0)�options)rGrZsetup_user_keys�replace)r_r^r5r6Z
key_prefixr r r!rUsrUr4cs�dtf�g}g�|r(�fdd�|D���fdd�t��d�D�}|D]<}t�|�}|��}|rHt|�dkrH|�t|dd���qH|S)	aRead host keys from /etc/ssh/*.pub files and return them as a list.

    @param blacklist: List of key types to ignore. e.g. ['rsa']
    @returns: List of keys, each formatted as a two-element tuple.
        e.g. [('ssh-rsa', 'AAAAB3Nz...'), ('ssh-ed25519', 'AAAAC3Nx...')]
    z%s.pubcsg|]}�|f�qSr r )r,Zkey_type)�public_key_file_tmplr r!r. sz(get_public_host_keys.<locals>.<listcomp>csg|]}|�vr|�qSr r )r,Zhostfile)�blacklist_filesr r!r.$s�)�*r'N�)rIr:rZload_text_file�split�lenrA�tuple)r3Zkey_listZ	file_list�	file_nameZ
file_contentsZkey_datar )rerdr!rSs 

�
�
rS)N)1�__doc__r:Zloggingr�rerL�typingrrrZ	cloudinitrrrrZcloudinit.cloudr	Zcloudinit.configr
Zcloudinit.config.schemarZcloudinit.distrosrr
Zcloudinit.settingsrr�__annotations__Z	getLogger�__name__r<rFr+�compiler?rIrRrrBr>rC�k�updaterDr"�listr`rUrSr r r r!�<module>sT�
���$

© 2025 Cubjrnet7