o
    x[hØ+  ã                
   @   s¬  U d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ d
egeg dœZeed< e e¡Zg d¢ZdgZ dZ!dZ"g Z#ee$ ed< i Z%i Z&eD ]2Z'e% (e'› d�e!e' dfe'› d�e!e' › d�dfe'› d�e!e' › d�dfi¡ e'› d�e&e'› d�< qwdZ)de$ddfdd„Z*de$ded ed!e+ddf
d"d#„Z,d$d%„ Z-d)d&ee	e$  fd'd(„Z.dS )*zSSH: Configure SSH and SSH keysé    N)ÚListÚOptionalÚSequence)Ú	lifecycleÚssh_utilÚsubpÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚALL_DISTROSÚug_util)ÚPER_INSTANCEÚcc_ssh)ÚidÚdistrosÚ	frequencyÚactivate_by_schema_keysÚmeta)ÚrsaÚecdsaÚed25519r   z/etc/ssh/ssh_host_%s_keyTÚHOST_KEY_PUBLISH_BLACKLISTÚ_privateé€  Ú_publicú.pubé¤  Ú_certificatez	-cert.pubz;o=$(ssh-keygen -yf "%s") && echo "$o" root@localhost > "%s"ÚkeyfileÚreturnc                 C   sl   d}t  ¡ }|r|t dd¡k rd}nd}t d¡}|dkr%t | 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   é	   r   i   r   Ússh_keyséÿÿÿÿr   N)	r   Úget_opensshd_upstream_versionr   ÚVersionr   Úget_group_idÚosÚchownÚchmod)r   Úpermissions_publicÚssh_versionÚpermissions_privateÚgid© r.   ú9/usr/lib/python3/dist-packages/cloudinit/config/cc_ssh.pyÚset_redhat_keyfile_perms=   s   
r0   ÚnameÚcfgÚcloudÚargsc           $      C   s’  |  dd¡r,tj dd¡}t |¡D ]}zt |¡ W q ty+   t t	d|¡ Y qw d|v räg }|d  
¡ D ];\}}|tvrSt d|¡rId}	nd	}	t	 d
|	|¡ q8t| d }
t| d }t |
||¡ d|v rs| dt|
ƒf¡ q8|r{t |¡ t 
¡ D ]c\}}||d v s�||d vr�qt| d t| d }}ddt||f g}z'tjddd�� tj|dd� W d   ƒ n1 sÀw   Y  t	 d||¡ W q tyâ   t t	d|› d|› �¡ Y qw nÈt |dt¡}t ¡ sñ|ndd„ |D ƒ}t|ƒ |¡}|�rt	 dd |¡¡ |D ]ž}t| }tj |¡�r�qt  tj !|¡¡ dd|dd d!|g}tjddd��l z*tj|dd"d#id$�\}}t "|d%d¡�sTt#j$ %t &|¡¡ |j'j(d&k�r_t)|ƒ W n9 tj*�y™ } z+t &|j+¡ ,¡ }|j-dk�r‡| ,¡  .d'¡�r‡t	 d(|¡ nt t	d)||¡ W Y d }~nd }~ww W d   ƒ n	1 �s¥w   Y  �qd*|v �rÄt |d* d+t/¡}t "|d* d,t0¡}nt/}t0}|�rét1|d-�}z|j2 3|¡ W n t�yè   t t	d.¡ Y nw zNt4 5||j'¡\}}t4 6|¡\}}t "|d/d¡} t 7|d0tj8¡}!g }"t "|d1d¡�r| 9¡ �pg }"nt	 d2¡ d3|v �r.|d3 }#|" :|#¡ t;|"|| |!ƒ W d S  t�yH   t t	d4¡ Y d S w )5NÚssh_deletekeysTz	/etc/ssh/zssh_host_*key*zFailed deleting key file %sr"   z4^(ecdsa-sk|ed25519-sk)_(private|public|certificate)$ÚunsupportedÚunrecognizedz Skipping %s ssh_keys entry: "%s"r   é   r   ÚHostCertificateÚshz-xcz/etc/ssh)Ú	recursiveF)ÚcapturezGenerated a key for %s from %szFailed generating a key for z from Ússh_genkeytypesc                 S   s   g | ]}|t vr|‘qS r.   )ÚFIPS_UNSUPPORTED_KEY_NAMES)Ú.0Únamesr.   r.   r/   Ú
<listcomp>¤   ó
    þzhandle.<locals>.<listcomp>z5skipping keys that are not supported in fips mode: %sú,z
ssh-keygenz-tz-NÚ z-fÚLANGÚC)r<   Ú
update_envÚssh_quiet_keygenÚredhatzunknown keyz!ssh-keygen: unknown key type '%s'z(Failed generating key type %s to file %sÚssh_publish_hostkeysÚ	blacklistÚenabled)rK   zPublishing host keys failed!Údisable_rootÚdisable_root_optsÚallow_public_ssh_keyszSSkipping import of publish SSH keys per config setting: allow_public_ssh_keys=FalseÚssh_authorized_keysz Applying SSH credentials failed!)<Úgetr'   ÚpathÚjoinÚglobr   Údel_fileÚ	ExceptionÚlogexcÚLOGÚitemsÚCONFIG_KEY_TO_FILEÚreÚmatchÚwarningÚ
write_fileÚappendÚstrr   Úappend_ssh_configÚPRIV_TO_PUBÚKEY_GEN_TPLÚSeLinuxGuardr   ÚdebugÚget_cfg_option_listÚGENERATE_KEY_NAMESÚfips_enabledÚsetÚ
differenceÚKEY_FILE_TPLÚexistsÚ
ensure_dirÚdirnameÚget_cfg_option_boolÚsysÚstdoutÚwriteÚdecode_binaryÚdistroÚosfamilyr0   ÚProcessExecutionErrorÚstderrÚlowerÚ	exit_codeÚ
startswithr   ÚPUBLISH_HOST_KEYSÚget_public_host_keysÚ
datasourceÚpublish_host_keysr   Únormalize_users_groupsÚextract_defaultÚget_cfg_option_strÚDISABLE_USER_OPTSÚget_public_ssh_keysÚextendÚapply_credentials)$r1   r2   r3   r4   Úkey_pthÚfÚcert_configÚkeyÚvalÚreasonÚtgt_fnÚ	tgt_permsÚprivate_typeÚpublic_typeÚprivate_fileÚpublic_fileÚcmdÚgenkeysÚ	key_namesÚskipped_keysÚkeytyper   ÚoutÚerrÚeÚhost_key_blacklistÚpublish_hostkeysÚhostkeysÚusersÚ_groupsÚuserÚ_user_configrM   rN   ÚkeysÚcfgkeysr.   r.   r/   Úhandlea   s  ÿÿ€


þÿÿÿÿþÿîÿÿþý	þ

ÿÿ€ÿü€ù€ô€
ý
ÿ
ÿÿÿ

ÿr£   c                 C   sV   t | ƒ} |rt | |¡ |r|sd}| d|¡}| dd¡}nd}tj| d|d� d S )NÚNONEz$USERz$DISABLE_USERÚrootrD   )Úoptions)ri   r   Úsetup_user_keysÚreplace)r¡   rŸ   rM   rN   Ú
key_prefixr.   r.   r/   r…     s   r…   rK   c                    sŠ   dt f ‰g }g ‰ | r‡fdd„| D ƒ‰ ‡ fdd„t ˆd ¡D ƒ}|D ]}t |¡}| ¡ }|rBt|ƒdkrB| t|dd… ƒ¡ q$|S )	a  Read 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.pubc                    s   g | ]}ˆ |f ‘qS r.   r.   )r?   Úkey_type)Úpublic_key_file_tmplr.   r/   rA     s    
ÿz(get_public_host_keys.<locals>.<listcomp>c                    s   g | ]}|ˆ vr|‘qS r.   r.   )r?   Úhostfile)Úblacklist_filesr.   r/   rA   #  rB   )Ú*r8   Né   )rk   rT   r   Úload_text_fileÚsplitÚlenr_   Útuple)rK   Úkey_listÚ	file_listÚ	file_nameÚfile_contentsÚkey_datar.   )r­   r«   r/   r|     s"   

ÿ
þ
€r|   )N)/Ú__doc__rT   Úloggingr'   r[   rp   Útypingr   r   r   Ú	cloudinitr   r   r   r   Úcloudinit.cloudr	   Úcloudinit.configr
   Úcloudinit.config.schemar   Úcloudinit.distrosr   r   Úcloudinit.settingsr   r   Ú__annotations__Ú	getLoggerÚ__name__rX   rg   r>   rk   r{   r   r`   rZ   rb   ÚkÚupdaterc   r0   Úlistr£   r…   r|   r.   r.   r.   r/   Ú<module>   sP   ü
ýÿ$ !