Ë
    x[hØ+  ã            
       óì  — 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j8                  e«      Zg d¢ZdgZ dZ!dZ"g Z#ee$   ed<   i Z%i Z&eD ]B  Z'e%jQ                  e'› d�e!e'z  dfe'› d�e!e'z  › d�dfe'› d�e!e'z  › d�dfi«       e'› d�e&e'› d�<   ŒD dZ)de$ddfd„Z*de$deded e+ddf
d!„Z,d"„ Z-d%d#ee	e$      fd$„Z.y)&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                 ó0  — d}t        j                  «       }|r|t        j                  dd«      k  rd}nd}t	        j
                  d«      }|dk7  rt        j                  | d|«       t        j                  | |«       t        j                  | › d�|«       y	)
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Úgids        ú9/usr/lib/python3/dist-packages/cloudinit/config/cc_ssh.pyÚset_redhat_keyfile_permsr1   =   s�   € ð ÐÜ×8Ñ8Ó:€KÙ�{¤Y×%6Ñ%6°q¸!Ó%<Ò<ð
 $Ñð $Ðä
×
Ñ
˜JÓ
'€CØ
ˆb‚yô
 	�‰�˜"˜cÔ"Ü‡H�HˆWÐ)Ô*Ü‡H�H�ˆy˜ÐÐ1Õ2ó    ÚnameÚcfgÚcloudÚargsc           	      ó„  — |j                  dd«      rPt        j                  j                  dd«      }t	        j                  |«      D ]  }	 t        j                  |«       Œ d|v �rag }|d   j                  «       D ]�  \  }}|t        vr3t        j                  d|«      rd}	nd	}	t        j                  d
|	|«       ŒAt        |   d   }
t        |   d   }t        j                  |
||«       d|v sŒu|j!                  dt#        |
«      f«       Œ’ |rt%        j&                  |«       t(        j                  «       D ]‰  \  }}||d   v s||d   vrŒt        |   d   t        |   d   }}ddt*        ||fz  g}	 t        j,                  dd¬«      5  t/        j.                  |d¬«       d d d «       t        j1                  d||«       Œ‹ �n¢t        j2                  |dt4        «      }t        j6                  «       s|n|D �cg c]  }|t8        vr|‘Œ c}}t;        |«      j=                  |«      }|r%t        j1                  ddj                  |«      «       |D �]  }t>        |z  }t        j                  jA                  |«      rŒ-t        jB                  t        j                  jE                  |«      «       dd|ddd|g}t        j,                  dd¬«      5  	 t/        j.                  |dd d!i¬"«      \  }}t        jF                  |d#d«      s2tH        jJ                  jM                  t        jN                  |«      «       |jP                  jR                  d$k(  rtU        |«       d d d «       �Œ d(|v r=t        j2                  |d(   d)t`        «      }t        jF                  |d(   d*tb        «      }nt`        }tb        }|r(te        |¬+«      }	 |jf                  ji                  |«       	 tk        jl                  ||jP                  «      \  }}tk        jn                  |«      \  }} t        jF                  |d-d«      }!t        jp                  |d.t$        jr                  «      }"g }#t        jF                  |d/d«      r|ju                  «       xs g }#nt        j1                  d0«       d1|v r|d1   }$|#jw                  |$«       ty        |#||!|"«       y # t        $ r t        j                  t        d|«       Y �Œ¥w xY w# 1 sw Y   �ŒMxY w# t        $ r$ t        j                  t        d|› d|› �«       Y �Œïw xY wc c}w # t.        jV                  $ r™}t        jN                  |jX                  «      j[                  «       }|j\                  dk(  r6|j[                  «       j_                  d%«      rt        j1                  d&|«       nt        j                  t        d'||«       Y d }~�Œzd }~ww xY w# 1 sw Y   �Œ—xY w# t        $ r t        j                  t        d,«       Y �Œ3w xY w# t        $ r t        j                  t        d2«       Y y w xY w)3NÚ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_genkeytypesz5skipping 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)rI   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ÚFIPS_UNSUPPORTED_KEY_NAMESÚsetÚ
differenceÚKEY_FILE_TPLÚexistsÚ
ensure_dirÚdirnameÚget_cfg_option_boolÚsysÚstdoutÚwriteÚdecode_binaryÚdistroÚosfamilyr1   Ú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)%r3   r4   r5   r6   Úkey_pthÚfÚcert_configÚkeyÚvalÚreasonÚtgt_fnÚ	tgt_permsÚprivate_typeÚpublic_typeÚprivate_fileÚpublic_fileÚcmdÚgenkeysÚnamesÚ	key_namesÚskipped_keysÚkeytyper    ÚoutÚerrÚeÚhost_key_blacklistÚpublish_hostkeysÚhostkeysÚusersÚ_groupsÚuserÚ_user_configrK   rL   ÚkeysÚcfgkeyss%                                        r0   Úhandler£   a   sÒ  € ð ‡w�wÐ Ô&Ü—'‘'—,‘,˜{Ð,<Ó=ˆÜ—‘˜7Ó#ò 	CˆAðCÜ—‘˜aÕ ð	Cð �SÒàˆØ˜J™×-Ñ-Ó/ò 	E‰HˆC�ØÔ,Ñ,Ü—8‘8ØJÈCôð +‘Fà+�FÜ—‘Ð>ÀÈÔLØÜ'¨Ñ,¨QÑ/ˆFÜ*¨3Ñ/°Ñ2ˆIÜ�O‰O˜F C¨Ô3à Ò$Ø×"Ñ"Ð$5´s¸6³{Ð#CÕDð	Eñ" Ü×&Ñ& {Ô3ä)4×):Ñ):Ó)<ò 	Ñ%ˆL˜+à˜s :™Ñ.Ø s¨:¡Ñ6àä" <Ñ0°Ñ3Ü" ;Ñ/°Ñ2ð &ˆLð ˜¤¨|¸[Ð.IÑ IÐJˆCðä×&Ñ& z¸TÔBñ 2Ü—I‘I˜c¨5Õ1÷2ä—	‘	Ø4°kÀ<õò	ô4 ×*Ñ*ØÐ"Ô$6ó
ˆô ×$Ñ$Ô&ñ ð %öàØÔ :Ñ:ò òð 	ô ˜7“|×.Ñ.¨yÓ9ˆÙÜ�I‰IØGØ—‘˜Ó&ôð
 !ó  	ˆGÜ" gÑ.ˆGÜ�w‰w�~‰~˜gÔ&ØÜ�O‰OœBŸG™GŸO™O¨GÓ4Ô5Ø  w°°b¸$ÀÐHˆCô ×"Ñ" :¸Ô>ñ ðÜ#Ÿy™yØ T°v¸s°mô ‘H�C˜ô  ×3Ñ3ØÐ/°ôô Ÿ
™
×(Ñ(¬×);Ñ);¸CÓ)@ÔAà—|‘|×,Ñ,°Ò8Ü0°Ô9÷ñ ð 	ðD  Ñ$Ü!×5Ñ5ØÐ&Ñ'ØÜ&ó
Ðô
  ×3Ñ3ØÐ&Ñ'¨Ô4Eó
Ñô 8ÐÜ,ÐáÜ'Ð2DÔEˆð	=Ø×Ñ×.Ñ.¨xÔ8ð=Ü"×9Ñ9¸#¸u¿|¹|ÓLÑˆ�Ü&×6Ñ6°uÓ=Ñˆˆ|Ü×/Ñ/°°^ÀTÓJˆÜ ×3Ñ3ØÐ$¤h×&@Ñ&@ó
Ðð ˆÜ×#Ñ# CÐ)@À$ÔGØ×,Ñ,Ó.Ò4°"‰Dä�I‰Ið>ôð
 ! CÑ'ØÐ/Ñ0ˆGØ�K‰K˜Ô ä˜$  lÐ4EÕFøôg ò CÜ—‘œCÐ!>À×BðCú÷N2ñ 2ûô
 ò Ü—‘ÜØ2Ø"�m 6¨,¨ð9÷ðüòøôB ×1Ñ1ò Ü×,Ñ,¨Q¯X©XÓ6×<Ñ<Ó>�CØ—{‘{ aÒ'¨C¯I©I«K×,BÑ,BØ%ô-ô Ÿ	™	Ð"EÀwÕOäŸ™ÜØFØ#Ø#ô	ÿùðú÷ñ ûôV ò 	=Ü�K‰KœÐ;×<ð	=ûô2 ò =Ü�‰”CÐ;Ö<ð=ús™   ÁSÅ7S>ÆS1Æ&S>Ç>T.ËW"ËB
T3ÏW/ Ï#C"X Ó$S.Ó-S.Ó1S;	Ó6S>Ó>)T+Ô*T+Ô3WÕBW×W"×W×W"×"W,	×/#XØXØ#X?Ø>X?c                 óÔ   — t        | «      } |rt        j                  | |«       |r)|sd}|j                  d|«      }|j                  dd«      }nd}t        j                  | d|¬«       y )NÚNONEz$USERz$DISABLE_USERÚrootrB   )Úoptions)rh   r   Úsetup_user_keysÚreplace)r¡   rŸ   rK   rL   Ú
key_prefixs        r0   r„   r„     sd   € äˆt‹9€DÙÜ× Ñ   tÔ,áÙØˆDØ&×.Ñ.¨w¸Ó=ˆ
Ø×'Ñ'¨¸Ó@‰
àˆ
ä×Ñ˜T 6°:Ö>r2   rI   c                 óf  — t         ›d�}g }g }| r| D �cg c]  }||fz  ‘Œ
 }}t        j                  |dz  «      D �cg c]  }||vr|‘Œ
 }}|D ]V  }t        j                  |«      }|j	                  «       }	|	sŒ+t        |	«      dkD  sŒ:|j                  t        |	dd «      «       ŒX |S c c}w c c}w )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...')]
    r   )Ú*r;   Né   )rj   rR   r	   Úload_text_fileÚsplitÚlenr]   Útuple)
rI   Úpublic_key_file_tmplÚkey_listÚblacklist_filesÚkey_typeÚhostfileÚ	file_listÚ	file_nameÚfile_contentsÚkey_datas
             r0   r{   r{     sÛ   € ö (4Ð5ÐØ€HØ€OÙð @Iö
Ø3;Ð  H ;Ó.ð
ˆð 
ô Ÿ	™	Ð"6¸Ñ"?Ó@öàØ˜?Ñ*ò 	ð€Ið ð ò 1ˆ	Ü×+Ñ+¨IÓ6ˆØ ×&Ñ&Ó(ˆÚœ˜H›¨Ó)Ø�O‰OœE (¨2¨A ,Ó/Õ0ð	1ð
 €Oùò#
ùòs
   ”B)½B.)N)/Ú__doc__rR   Úloggingr)   rY   ro   Útypingr   r   r   Ú	cloudinitr   r   r   r	   Úcloudinit.cloudr
   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.distrosr   r   Úcloudinit.settingsr   r   Ú__annotations__Ú	getLoggerÚ__name__rV   re   rg   rj   rz   r   r^   rX   r`   ÚkÚupdatera   r1   Úlistr£   r„   r{   © r2   r0   ú<module>rË      sˆ  ðò &ã Û Û 	Û 	Û 
ß +Ñ +ç 5Ó 5Ý !Ý #Ý .ß 2Ý +ð Øˆ}ØØ!ñ	€€jó ð €g×Ñ˜Ó!€â0Ð Ø'˜[Ð à)€ØÐ à(*Ð ˜D ™IÓ *àÐ Ø€Ø	ò 0€AØ×Ñàˆc�ˆN˜\¨AÑ-¨uÐ5Øˆc�ˆM˜|¨aÑ/Ð0°Ð5°uÐ=Øˆc�Ð L°1Ñ$4Ð#5°YÐ!?ÀÐ Gð	
ôð &' C w -€K�1�#�X�Òð0ð L€ð!3 cð !3¨dó !3ðH]=�ð ]=˜6ð ]=¨%ð ]=°tð ]=Àó ]=ò@?ñ" H¨X°c©]Ñ$;ô r2   