{_jiddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZddlmZmZddlmZddlmZmZmZmZddlmZddlmZmZmZmZm Z m!Z!m"Z"ej#e$Z%d Z&e&'d Z(e&'d Z)Gd dZ*Gdde*eZ+Gdde*eZ,GddeZ-Gdde-Z.Gdde+Z/dZ0de1de2de3fdZ4e5de5de5d e5d!e5d"d#Z6Gd$d%e/Z7Gd&d'eZ8de9fd(Z:deefd)Z;dS)*N)abstractmethod)ListOptional)Core Packaging) LicenseCLN)AbstractFeature FeatureError FeatureStatusea4_only)cPanel) OsReleaseInfo check_runcheck_run_outside_sandboxrunrun_cmd_and_log_outside_sandbox_wrap_outside_sandbox_shell os_versionzexport PATH=/opt/imunify360/venv/bin:$PATH; _els_tmp=$(mktemp) && curl -sf -o "$_els_tmp" {url} && sh "$_els_tmp" -i; _els_rc=$?; rm -f "$_els_tmp"; exit $_els_rczHhttps://repo.alt.tuxcare.com/alt-php-els/install-els-alt-php-rpm-repo.sh)urlzHhttps://repo.alt.tuxcare.com/alt-php-els/install-els-alt-php-deb-repo.shc eZdZdZdZdZeddeefdZ edefdZ edZ e ede fd Zed Zede fd Zejd Zejd ZdefdZdS)SimpleInstallerMixInaThis is a mixin class implementing common case installation scenario. Installation is supposed to be through a single command cls.INSTALL_CMD. Removal is done through interpolating a space separated list of package names to remove into cls.REMOVE_CMD_TMPL. List of packages to remove is obtained by collecting all installed alt-php* packages except those we want to keep (as returned by required_packages()). z /bin/falseNenabledcdSNselfrs W/opt/imunify360/venv/lib/python3.11/site-packages/im360/subsys/features/hardened_php.py generate_repoz"SimpleInstallerMixIn.generate_repoHc KdSrrrs rpre_install_cmdz$SimpleInstallerMixIn.pre_install_cmdLs r!cdSrrrs r remove_repoz SimpleInstallerMixIn.remove_repoPr r!returnc"KtS)z0Set of installed package names matching alt-php*)setrr!r_list_alt_php_packagesz+SimpleInstallerMixIn._list_alt_php_packagesTsuu r!cD|dp |dkp|dkS)Nzalt-php-internalzalt-php-configzalt-php-hyperscan) startswith)clspkgs r_keep_installedz$SimpleInstallerMixIn._keep_installedZs5 NN- . . *&& *)) r!crKd{V}tfd|DS)z@Set of installed alt-php packages except those we keep installedNc3FK|]}||VdSr)r/).0r.r-s r z9SimpleInstallerMixIn._feature_packages..is6NN3S5H5H5M5MN3NNNNNNr!)r*r))r- all_alt_phps` r_feature_packagesz&SimpleInstallerMixIn._feature_packagesesO 6688888888 NNNN+NNNNNNr!cKtj|jdd{V|dd{Vt |j|jd{VSNTr)asyncio to_threadrr#r INSTALL_CMDINSTALL_LOG_FILE_MASKr%s rinstallzSimpleInstallerMixIn.installks  2DAAAAAAAAAA""4"0000000005  d8         r!c lKtj|jd{V|jdt tj| d{V}| dd{Vt||j d{VS)N Fr8) r9r:r&REMOVE_CMD_TMPLformatjoinmapshlexquoter5r#rREMOVE_LOG_FILE_MASK)rcmds rremovezSimpleInstallerMixIn.removexs 0111111111")) HHSD,B,B,D,D&D&D&D&D&D&DEE F F  ""5"1111111114 *         r!cTKt|d{VSr)boolr5r%s r_check_installed_implz*SimpleInstallerMixIn._check_installed_impls2$0022222222333r!r)__name__ __module__ __qualname____doc__r;r@rrrJrr#r& staticmethodr)r* classmethodr/r5r raise_if_shouldnt_install_nowr=raise_if_shouldnt_remove_nowrHrKrr!rrr:skK"OXd^^T^^#^\  [ OOOO[O 2   32  1  21 4T444444r!rceZdZdZdZdZdZdejzZ de zZ de zZ dZ d Z d Zd Ze e d gZd ZedZdZdZddeefdZdefdZdZedefdZdS)HardenedPHPCentosz(/etc/yum.repos.d/imunify360-alt-php.repoz/etc/yum.repos.d/php-els.repoz/etc/yum/vars/phpelstoken Hardened-PHP /var/log/%s%s/install-hardenedphp.log.*%s/remove-hardenedphp.log.*z:yum group mark remove alt-php; yum -y groupinstall alt-phpz0yum group mark install alt-php; yum -y remove {}zdnf config-manager --enable crbz dnf config-manager --disable crbc tj|jdS#t$rYdSt$r$t d|jYdSwxYwNzCan't delete %s)osrHLEGACY_REPO_FILEFileNotFoundErrorOSErrorloggererrorr%s r_remove_legacy_repoz%HardenedPHPCentos._remove_legacy_reposz C Id+ , , , , ,     DD C C C LL*D,A B B B B B B C A)AActjgdtjtjdkrdStj|jS)N)rpm-qels-php-releasestdoutstderrrF) subprocesscallDEVNULLr]pathexists ELS_REPO_FILEr-s r_els_php_release_installedz,HardenedPHPCentos._els_php_release_installedsZ O000!)!)       5w~~c/000r!c"tt}tj|dtj}|jdkrNt d|j|j d dSdS)NTshellrkrz%ELS RPM repo setup failed (rc=%d): %sreplaceerrors) r_ELS_RPM_SETUPrlrPIPE returncoderarbrkdecodestriprrGresults r_install_els_repoz#HardenedPHPCentos._install_els_repos).994 HHH   ! ! LL7! $$I$66<<>>      " !r!cj|sdStj}|sdS tjtj|jdtj|jtj tj ztj zd}tj |d5}| |dddn #1swxYwYtj|jddS#t$r$t d|jYdSwxYw)NTexist_okwCan't write %s)rsr get_server_idr]makedirsrodirname TOKEN_FILEopenO_WRONLYO_CREATO_TRUNCfdopenwritechmodr`rarbr server_idfdfs r _write_tokenzHardenedPHPCentos._write_tokensY..00  F,..   F < K884 H H H H bj(2:5B 2s## #q """ # # # # # # # # # # # # # # # HT_e , , , , , < < < LL)4? ; ; ; ; ; ; >$/ 0 0 '  $ $ & & &..00 %  " " $ $ $ r!cKtdsdS|r.t|jd{VdSt|jd{VdS)N9)rr,rENABLE_CRB_CMDsplitDISABLE_CRB_CMDrs rr#z!HardenedPHPCentos.pre_install_cmds||&&s++ : F  :D/557788 8 8 8 8 8 8 8 8 8D0668899 9 9 9 9 9 9 9 9 9r!c.|dSr)rcr%s rr&zHardenedPHPCentos.remove_repos   """""r!r'cKtgdd{V}t|S)N)rfz-qaz --queryformatz%{NAME} alt-php*)rr)r}r) raw_outputs rr*z(HardenedPHPCentos._list_alt_php_packagessd$ D D D        :$$&&,,..///r!r)rLrMrNr^rqrNAMErPRODUCTLOG_DIRr<rFr;r@rrrA _CMD_LISTrcrQrsrrrrJrr#r&rPr)r*rr!rrUrUs7A3M,J Ddl*G:WD87BNKHO6N8Oo44R889ICCC 1 1[ 1<<<&Xd^:T::::###0#000\000r!rUceZdZdZdZdZdejzZdezZ dezZ dZ dZ e e d gZed Zd Zd ZddeefdZdefdZedefdZedefdZdZedefdZd S)HardenedPHPUbuntuz$/etc/apt/sources.list.d/php-els.listz!/etc/apt/auth.conf.d/php-els.confrVrWrXrYzapt-get install -y alt-phpzapt-get purge -y {}rZctjgdtjtj}|jdkr|jdksdStj |j S)N) dpkg-query-Wz-f=${db:Status-Status}rhrirs installedF) rlrr{rnr|rjr~r]rorprq)r-rs rrsz,HardenedPHPUbuntu._els_php_release_installedsx    ?%       " "v}':':'<'< 'L'L5w~~c/000r!cJ|tt}tj|dtj}|jdkrNtd|j|j d dSdS)NTrurz%ELS DEB repo setup failed (rc=%d): %srwrx) _clear_reinstreq_if_stuckr_ELS_DEB_SETUPrlrr{r|rarbrkr}r~rs rrz#HardenedPHPUbuntu._install_els_repos &&((().994 HHH   ! ! LL7! $$I$66<<>>      " !r!cp|sdStj}|sdS tjtj|jdtj|jtj tj ztj zd}tj |d5}| d|zdddn #1swxYwYtj|jddS#t$r$t d|jYdSwxYw)NTrrrz ? ? ? ? ? ? @s6B D;C  D C$$D'C$(D*D54D5Nrc~|s||dSr)rsrrrs rrzHardenedPHPUbuntu.generate_repos@..00 %  " " $ $ $ r!c KdSrrrs rr#z!HardenedPHPUbuntu.pre_install_cmd$s r!r'ctjgdtjtj}|jdko|jdkS)N)rrz-f=${db:Status-Eflag}rhrirs reinstreq)rlrr{rnr|rjr~)rs r_els_php_release_reinstreqz,HardenedPHPUbuntu._els_php_release_reinstreq's\    ?%     A%O&-*=*=*?*?<*OOr!c|sdStdtjgdddS)NFzfels-php-release is wedged at reinstreq from a prior interrupted install; force-removing to unblock apt)dpkgz--removez--force-remove-reinstreqrh)checkT)rrarbrlrrrs rrz+HardenedPHPUbuntu._clear_reinstreq_if_stuck5sm--// 5  B            tr!c.|dSr)rr%s rr&zHardenedPHPUbuntu.remove_repoHs &&(((((r!cKtgdd{Vd}t d|DS)N)rrz-fz${Package} ${db:Status-Status} r c3TK|]#}|\}}|dk|V$dS) installedN)r)r2liner.statuss rr3z;HardenedPHPUbuntu._list_alt_php_packages..]sL   $ V$$ %$$$   r!)rr}r~rr))pkgs_in_dpkg_dbs rr*z(HardenedPHPUbuntu._list_alt_php_packagesKs VXX UWW U4[[    '      r!r)rLrMrNrqrrrrrr<rFr;r@rArrQrsrrrrJrr#rPrrr&r)r*rr!rrrsi:M8N Ddl*G:WD87B.K+Oo44R889I11[1"   @@@,Xd^ T P P P P\ P$[$))) #   \   r!rc>eZdZdZdZdZdZdZdZdZ de fdZ d S) HardenedPHPCloudLinuxz4HardenedPHP is managed by lvemanager in CloudLinuxOSemptyc K|Srrr%s rinitzHardenedPHPCloudLinux.initjs  r!crKtgdd{V\}}}dtj|dk|jdiS)N)rfrg lvemanageritemsr)r lve_installedmessage)rr MANAGED_BY_LVEMSG)rrc_s rrzHardenedPHPCloudLinux.statusms[88899999999Aq '6!#q8  r!c.Kt|jrr rr%s rr=zHardenedPHPCloudLinux.installw48$$$r!c.Kt|jrrr%s rrHzHardenedPHPCloudLinux.removezrr!r'c KdS)NTrr%s rrKz+HardenedPHPCloudLinux._check_installed_impl}s tr!N) rLrMrNrr<rFrrr=rHrJrKrr!rrres| @C#"   %%%%%%Tr!rceZdZdZdZdS)HardenedPHPCloudLinuxSoloz1HardenedPHP is not supported in CloudLinuxOS Soloc2Kdtj|jdiS)Nr)rr)r NOT_SUPPORTED_BY_CL_SOLOrr%s rrz HardenedPHPCloudLinuxSolo.statuss( '@8  r!N)rLrMrNrrrr!rrrs( =C     r!rcjeZdZdZdejzZdezZdezZdZ dZ dZ e e gZ e dZe d Ze d efd Zdd eefd ZdZedeefdZdefdZefdZeejdZeejdZ xZ!S) EaPHPCentosz0/etc/yum.repos.d/imunify360-ea-php-hardened.reporWz%s/install-ea_php.log.*z%s/remove-ea_php.log.*z5yum -y groupremove ea-php; yum -y groupinstall ea-phpzD/opt/imunify360/venv/share/imunify360/scripts/remove_hardened_php.pyzimunify360-ea-php-hardenedctjtjtj|jSr)r]rorBrDATADIRbasename REPO_FILErrs r_repo_tmpl_filepathzEaPHPCentos._repo_tmpl_filepaths-w||I-rw/?/? /N/NOOOr!c\ ddfdtjD}n$#t$r}t d|d}~wwxYwt jd}||z}t j| S)N:rZc3HK|]}t|zVdSr)str)r2kseptokens rr3z-EaPHPCentos._prepare_token..sC()E!H #r!z*License token can not be created by error sign) rBrVERIFY_FIELDS_V1KeyErrorr base64 b64decodeencodeurlsafe_b64encoder})r-rfieldse sign_bytesdatars ` @r_prepare_tokenzEaPHPCentos._prepare_tokens CWW-7-HFF   @Q@@  %eFm44 }}+'--44666s.3 AAArc|rdnd} ||}nV#t$rI}|s;d}tj|}n|Yd}~nd}~wwxYwt |d5}|}| ||cdddS#1swxYwYdS)N10zunregister-token-placeholderr)rr) rr rrrr}rrreadrA)r-rr enabled_flagrtoken_placeholder repo_templatetemplates r_prepare_repo_confzEaPHPCentos._prepare_repo_confsP%.ss3  &&u--EE    $B!0%,,..&((  #))++S 1 1 F]$))++H?? ?EE F F F F F F F F F F F F F F F F F Fs& A1?A,,A1+CCCNc|Xtj} ||j||jddk}n#t $rd}YnwxYwt j}t j}|s+|rtdt dt|jd5}| |||dddn #1swxYwYtj|jtj|jdS)NrrTz=tried to enable repo but server_id is empty (not registered?)zDserver_id is empty (not registered?) ignoring due to removal of repor) configparser ConfigParserrr REPO_NAME Exceptionr get_tokenrr rawarningrrrr]rstatrst_mode)rrreporr repo_files rrzEaPHPCentos.generate_repos ?,..D  $.)))t~.y9S@    $&&,..   "$ NN   $.# & & E) OOD33E7CC D D D E E E E E E E E E E E E E E E )A)A)C)C!D!D!LMMMMMs#1A AA*C99C=C=c2|ddSNFr8)rr%s rr&zEaPHPCentos.remove_repos 5)))))r!r'cKtddd{V}|fdtdt dDS)Nz5rpm -qa --queryformat "%{NAME} %{RELEASE} " "ea-php*"T)rvc8g|]}||dzdS))namereleaser)r2iwordss r z5EaPHPCentos._query_eaphp_versions..s=   1X%A, 7 7   r!r)rr}rrangelen)rrs @r_query_eaphp_versionsz!EaPHPCentos._query_eaphp_versionss$ D         !!##))++    1c%jj!,,    r!cKtjd}|d{VD]*}||d d|dvrdS+dS)Nz ea-php\d+r  cloudlinuxr TF)recompilersearch)r versioned_rer.s rrKz!EaPHPCentos._check_installed_implsvz,// 3355555555  C##CK00< C N22ttur!cTKtd{VSrsuperrr __class__s rrzEaPHPCentos.status-WW^^%%%%%%%%%r!crK|dt|j|jd{VSr7)rrr;r<r%s rr=zEaPHPCentos.installsZ 4(((4  d8         r!crK|dt|j|jd{VSr)rr REMOVE_SCRIPTrFr%s rrHzEaPHPCentos.removesZ 5)))4   9         r!r)"rLrMrNrrrrr<rFr;r#rrrQrrrJrrrr&rPrdictrrKr rr rRr=rSrH __classcell__rs@rrrsBIdl*G5?3g=IKZM,Im,IPP[P 7 7[ 7FFFF[F"NNXd^NNNN2***  d    \  T&&&&X&2  32X 1  21X     r!rzFor EL9/Ubuntu20 cpanel servers use cPanel Profile to configure harden php. More info: https://docs.cpanel.net/ea4/basics/the-ea-cpanel-tools-package-scripts/ https://docs.cpanel.net/whm/software/easyapache-4-interface/rawcommandr'crtj|}|didsM|didd}td|||d}t |t r|niS)Nmetadatarreasonunknownzwhmapi1 {} failed: {}r)jsonloadsgetr rA isinstancer$)r'r(outputr+rs r_parse_whmapi1_outputr2 s Z__F ::j" % % ) )( 3 3LJ++//)DD299'6JJKKK ::f  DdD)) 144r1r!)ea-apache24-mod_mpm_workerea-apache24-mod_mpm_eventea-apache24-mod_cgidzea-apache24-mod_http2)ea-apache24-mod_mpm_preforkr4ea-apache24-mod_cgi)r6r3r7)r5r3r4)r7r6)r6r3r4r7r5cNeZdZeZdZdezZdZdezdzZe e j dZ dZ e e jdZd effd Zd Zed eed eed eefdZed eefdZed eefdZxZS)EaPHPCentosEL9zimunify_hardened_php.jsonz /etc/cpanel/ea4/profiles/custom/z6/etc/cpanel/ea4/profiles/vendor/cloudlinux/allphp.jsonz,/usr/local/bin/ea_install_profile --install z; _rc=$?; if [ "$_rc" -ne 0 ]; then echo "ea_install_profile failed with exit code $_rc"; tail -n 20 "$(ls -t /usr/local/cpanel/logs/packman/errors/* 2>/dev/null | head -1)" 2>/dev/null; fi; exit $_rccK|dtj|jd{Vt gdd{V|d{Vt |j|jd{VS)NTr8)yumz-yr=zea-profiles-cloudlinux) rr9r:_setup_alt_php_repor_save_imunify_profilerINSTALL_PROFILE_CMDr<r%s rr=zEaPHPCentosEL9.install[s 4(((  8999999999( > > >         ((*********4  $d&@         r!ctj|jr||s||dSrrr%s rr<z"EaPHPCentosEL9._setup_alt_php_reporrr!cK|d tj|jn#t$rYnwxYwd|jzS)NFr8z)Repo imunify360-ea-php-hardened removed. )rr]rHIMUNIFY_PROFILE_PATHr_rr%s rrHzEaPHPCentosEL9.removeysg 5)))  Id/ 0 0 0 0     D ;dhFFs4 AAr'cKtj|jsdSt d{VS)NF)r]rorprArrKrs rrKz$EaPHPCentosEL9._check_installed_implsOw~~d788 5WW22444444444r!c.K|d{V}tj|jd{V}|||}dddd|jzdddgd|Dz}t |d{V}t|ddS) N/usr/sbin/whmapi1 --output=jsonea4_save_profilez filename=zname=Imunify Hardened PHPz*desc=Imunify-managed Hardened PHP profile.z overwrite=1cg|]}d|zS)zpkg=r)r2ps rrz8EaPHPCentosEL9._save_imunify_profile..s & & &AVaZ & & &r!)_get_installed_ea4_packagesr9r:_load_baseline_packages_merge_profile_packagesIMUNIFY_PROFILE_FILENAMErr2)rrbaselinepkgsargsr's rr=z$EaPHPCentosEL9._save_imunify_profiles::<<<<<<<< !*4+GHHHHHHHH++Ix@@    $7 7 ' 8   ' & & & &'dOO######c#566666r!rrMct|}t}|D],}|t|tz}-t |t||z zSr)r)_EA4_MUTUAL_CONFLICTSr/ frozensetsorted)rrM installed_setblockedr.s rrKz&EaPHPCentosEL9._merge_profile_packagesshI %%  C CC ,00ikkBB BGGms8}}w'>?@@@r!cKtgdd{V}t|d}d|vrtdt|z|dS)N)rDrE$ea4_get_currently_installed_packagesrWpackageszKwhmapi1 ea4_get_currently_installed_packages returned no 'packages' field: )rr2r repr)r'rs rrIz*EaPHPCentosEL9._get_installed_ea4_packagess           % 7   T ! !(t**  Jr!ct|j5}tj|dpgcdddS#1swxYwYdS)NrN)rBASELINE_PROFILE_PATHr-loadr/)r-rs rrJz&EaPHPCentosEL9._load_baseline_packagess #+ , , 29Q<<##F++1r 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s)A  AA)rLrMrN_CPANEL_HARDENED_PHP_MSGrrLrAr[r>r r rRr=r<rSrHrJrKr=rPrrrKrIrQrJr%r&s@rr9r9Cs "C:*-EE A 7    2  32X *1GG21XG 5T 5 5 5 5 5 5777$ A9 A(,S  A c A A A\ A tCy   \ &2S 222[22222r!r9ceZdZdZdZdZeZdZdZ dZ dZ e e jdZe e jdZe fd Zd efd ZxZS) EaPHPUbuntuCpanelz+/etc/apt/sources.list.d/cloudlinux-ea4.listzDhttps://repo.cloudlinux.com/cloudlinux-ubuntu/cloudlinux-ea4/stable/zcloudlinux-ea4rct|jd5}|d|jdddddS#1swxYwYdS)Nrzdeb z ./ )rrrREPO_URL)rrs r_generate_repoz EaPHPUbuntuCpanel._generate_repos $.# & & 1! GG/4=/// 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1sAA Ac tj|jdS#t$rYdSt$r$t d|jYdSwxYwr\)r]rHrr_r`rarbr%s r _remove_repozEaPHPUbuntuCpanel._remove_reposs < Idn % % % % %     DD < < < LL*DN ; ; ; ; ; ; >21X>&&&&X&.T........r!r_c@tjdS)Nz/etc/cloudlinux-release)r]rorprr!r _is_cloudlinux_release_installedrls 7>>3 4 44r!cbtj}tjsLtjs9tjs&tjstjr=|r+ttj dkrtS|rtStStjr!tjrt St"Stjstjr%|rt)rt"St*St,SdS)z :return: AbstractFeature subclass: feature that implements Hardened PHP installation for current environment. N)r is_installedr is_centosis_rhelis_oracle_linux is_almalinux is_rockylinuxintdistro major_versionr9rrU is_cloudlinuxis_cloudlinux_solorr is_ubuntu is_debianrlr_r) has_cpanels rget_hardened_php_featurer}s( $&&J!! %  " " %  ( * * %  % ' ' %  & ( ( %  %#f24455::! !  % $ $"$$%  + - - -, ,$$  !M$;$=$=!  %/11 -,,$ $  4r!)rs<    !!!!!!!!<<<<<<<<888888 877777  8 $ $!'' *( !'' *(J4J4J4J4J4J4J4J4ZW0W0W0W0W0,oW0W0W0tA A A A A ,oA A A HO:      5    t t t t t #t t t pD 2u 2s 2t 2 2 2 2 $-9 $$#,) ##"+ ""%9 &I =$$NH2H2H2H2H2[H2H2H2V'.'.'.'.'.'.'.'.T5$5555(?";r!