ãããŠãæã人æ°ã®ãããããã¯ãã€ãŸãLinuxã§ã®2èŠçŽ èªèšŒããå§ããŸããã-æ§æãªãã·ã§ã³ãšã¯äœãããããŠéåžžã«åªãããœãªã¥ãŒã·ã§ã³ã§ãããã¡ã€ã«ã§å®æãããå¿ èŠãããçç±ã§ãã
ã«ã¹ã¿ãã€ãºãªãã·ã§ã³
ç§ãèšã£ãããã«ãLinuxã®2faããŒãã¯éåžžã«äººæ°ãããããããå¯èœã«ããå€ãã®ãœãªã¥ãŒã·ã§ã³ããããŸãã
sshã«ããèªèšŒã®2çªç®ã®èŠçŽ ãäœæããã«ã¯ãäž»ã«2ã€ã®æ¹æ³ããããŸãã æåã®æ¹æ³ã¯æ¬äŒŒç§ã®èŠçŽ ã§ãããsshdèšå®ã®ForceCommandãªãã·ã§ã³ã䜿çšããŠãæ¿èªã¹ããŒãžã®åŸã«ä»»æã®ãã€ããªãéå§ããŸãã
www.openssh.com/txt/release-4.4
ãã®æ¹æ³ã®å©ç¹ã¯äœã§ããïŒ openssh4.4ã§ãµããŒããè¿œå ããããããé©åãªèšå®ããªã³ã«ã§ããªããµãŒããŒãèŠã€ããããšã¯ã»ãšãã©ãããŸããã ããã§ãå©ç¹ã¯æ¬è³ªçã«çµãããŸãã çæã¯ã¯ããã«ãããŸãïŒ
- tcpportforwardãæå¹ã«ããŠããå Žåããã€ããªå ã®æ¢åã®ãã§ãã¯ããã€ãã¹ããŠããŒãã転éã§ããŸãã
- rcãã¡ã€ã«ã«æžã蟌ãŸãããã®ã¯ãã¹ãŠForceCommandã®åã«å®è¡ããããããããã«exec shã®å®è¡ãç»é²ããæ¯å2çªç®ã®èŠå ã§å ¥åã確èªããããšã¯ã§ããŸããã
- ãŠãŒã¶ãŒãsftpãŸãã¯scpãä»ããŠãµãŒããŒã«æ¥ç¶ãããšãsshã¯ã©ã€ã¢ã³ãã䜿çšããæšæºãã°ã€ã³ã®å Žåã«å°å·ã§ããæåŸ ç¶ã¯è¡šç€ºãããŸããã ãããã£ãŠããã®å Žåã®ãŠãŒã¶ãŒã®å©äŸ¿æ§ã¯äºå®äžç¡å¹ã«ãªããŸãã
ãã®ãããã»ãšãã©ã®æé ã§æäŸãããŠãã2çªç®ã®æ¹æ³ãæ€èšããŸãã ãã¡ãããããã¯pamã¢ãžã¥ãŒã«ã䜿çšããèšå®ã§ãã
PAMã«ãã2çªç®ã®èŠå
å€å žçãªã¹ã¯ãªããã¯/etc/pam.d/sshd configã®ä¿®æ£ã§ãããé©åãªã¢ãžã¥ãŒã«ãæåã«ããã次ã®åœ¢åŒã§é 眮ãããŸãã
auth required pam_google_authenticator.so
ãã ããããã¯ãèªèšŒãPAMã¬ãã«ã§å®è¡ãããªãå Žåã¯åé¡ã解決ããŸããããããŒã«ããèªèšŒãªã©ãsshdãµãŒããŒèªäœã䜿çšããŠå®è¡ãããŸãã ãã®å Žåã®å¯ŸåŠæ¹æ³
èªèšŒæ¹æ³
幞ããããŒãžã§ã³6.2以éã®opensshã§ã¯ã2çªç®ã®èŠçŽ ããã€ãã£ãã§ãµããŒãããŠããŸããã ããã§ã AuthenticationMethodsãªãã·ã§ã³ã䜿çšããŠããµãŒããŒã«å ¥ãããã«æ£åžžã«æž¡ãããå¿ èŠãããèªèšŒæ¹æ³ããªã¹ãã§ããŸãã
lwn.net/Articles/544640
åæ§ã®æ§æã®äŸïŒ
AuthenticationMethods publickey,password hostbased,publickey
ããã«äœãæžãããŠããŸããïŒ èªèšŒãæåãããã«ã¯ã次ã®çµã¿åããã®ãããããå®è¡ããå¿ èŠããããŸãã
- å ¬ééµ+ãã¹ã¯ãŒã
- ãŸãã¯ãã¹ãããŒã¹+å ¬ééµ
ããããäºèŠçŽ èªèšŒã®ããã«ã¢ãžã¥ãŒã«ãã©ãã«æ¥ç¶ããã®ã§ããããïŒ ããŒããŒãã€ã³ã¿ã©ã¯ãã£ãæ¹åŒã§æ¥ç¶ãããŸãã ã€ãŸããåãgoogle authã¢ãžã¥ãŒã«ãä»ããpublickeyã«ããèªèšŒåŸã«ç¢ºèªãå¿ èŠãªå Žåã¯ãsshdæ§æã§æ¬¡ãèšå®ããŸãã
AuthenticationMethods publickey,keyboard-interactive
ãŸãã pam.d / sshdãã¡ã€ã«ã§æ¬¡ãæå®ããŸãã
auth required pam_google_authenticator.so
ãã¹ãŠãéåžžã«ç°¡åã§ãã ãã ãã1ã€ã®æ¹æ³ãsshdïŒpublickeyãŸãã¯kerberosïŒã®ã¬ãã«ã§å®è¡ããããã1ã€ã®æ¹æ³ãpamïŒåããã¹ã¯ãŒãïŒã®ã¬ãã«ã§å®è¡ãããå Žåãããã«ããã€ãã®èªèšŒæ¹æ³ãæå¹ã«ããå¿ èŠããããŸãã åé¡ã¯ããã¹ã¯ãŒããšããŒããŒãã€ã³ã¿ã©ã¯ãã£ãã®äž¡æ¹ãåãpam-configã§åŠçãããããšã§ãã ãã®ãããªsshdæ§æã®å ŽåãèªèšŒã®ç¬¬1段éã第2段éããåé¢ããæ¹æ³ãäœããã®æ¹æ³ã§åŠç¿ããå¿ èŠããããŸãã
AuthenticationMethods password,keyboard-interactive publickey,keyboard-interactive
ç§ã¯ãã®åé¡ã®è§£æ±ºçãé·ãéæ¢ããŠããŸããããfacebookãããèªäœã§2çªç®ã®èŠå ãäœã£ãæ¹æ³ã®èª¬æã«åºäŒããŸããã
www.slideshare.net/yandex/004-tim-tickelchadgreene2fac
www.youtube.com/watch?v=pY4FBGI7bHM
Facebookã®èŠåå¡ãèªå® ã§2faãå®è£ ããããšã«ã€ããŠè©±ãããšãã圌ãã¯Authentication Submethodsã«èšåããŸãã ã ããã«ãããèªèšŒãç¹å®ã®ããã€ã¹ã«å¶éã§ããŸãã ãã®çµæãååã¯ãã¥ãªãä»ããŠããŒããŒãã€ã³ã¿ã©ã¯ãã£ãã®èªèšŒãæå®ããããšãã§ããŸããã
lwn.net/Articles/544640ïŒdugsongããã®ã³ã¡ã³ãïŒ
ãããããããã®ã³ããããŸãã¯åžæããããŒãžã§ã³ã®openssh-6.2p1ãèŠã€ããè©Šã¿ã¯å€±æããŸããã ãããã£ãŠãåé¡ãããã«èª¿æ»ããããšã決å®ãããŸããã
ãã ã»ããã¢ããå®éš
ããã§ããPAMã¹ã¿ãã¯ãšã¯äœããã¢ãžã¥ãŒã«ãæ¥ç¶ã§ãããªãã·ã§ã³ã¯äœããæãåºããŸãã authã»ã¯ã·ã§ã³ã®æšæºæ¥ç¶ãªãã·ã§ã³ïŒå¿ é ãå¿ é ãååããªãã·ã§ã³ïŒã誰ããèŠããŠããŸãã
ãããããããã®ãªãã·ã§ã³ã®ã¿ã䜿çšããŠã¢ãžã¥ãŒã«ãçµã¿åãããå®éšã§ã¯äœãèµ·ãããŸããã§ããã ããŒèªèšŒã®å Žåã§ããŠãŒã¶ãŒã«ãã¹ã¯ãŒããèŠæ±ãããããã¹ã¯ãŒããåå ¥åããããšã§2çªç®ã®èŠçŽ ããã€ãã¹ããããšãã§ããŸãã
ãããŠãPAMã®ãã¥ãŒãã³ã°ããã现ããéå§ããŸãã çµæã®ã¹ããŒã¿ã¹ããšã«ãã¹ã¿ãã¯ãžã®åœ±é¿ã瀺ãããšãã§ããŸãã 1ã€ä»¥äžã®ãã©ã°ã€ã³ãã¹ãããããŸãã
ããšãã°ããã®ããã«ã
auth [success=1 default=ignore] pam_radius_auth.so
duosecurityãä»ããŠ2èŠçŽ ãèšå®ãããšãããŠãŒã¶ãŒãšã®ã€ã³ã¿ã©ã¯ãã£ããªå¯Ÿè©±ãäžå¯èœãªå Žåã«ãã¢ãžã¥ãŒã«ãPAM_ABORTã®ã¿ãè¿ãããšã«æ°ã¥ããããããŸãã«ãã®pamæ§æãäœæããŸããã ã€ãŸããèªèšŒã¯æ¬¡ã®ããã«ãªãå§ããŸãã
AuthenticationMethods gssapi-with-mic,keyboard-interactive password,keyboard-interactive
ãããŠãconfig pam.d / sshdã¯æ¬¡ã®ããã«ãªããŸãã
auth [success=2 abort=ignore default=1] /lib64/security/pam_duo.so auth [success=1 default=ignore] pam_unix.so nullok_secure auth requisite pam_deny.so auth required pam_permit.so
å¯èœãªèªèšŒã®æåã®ããŒãžã§ã³-gssapi-with-micãããŒããŒãã€ã³ã¿ã©ã¯ãã£ãã§äœãèµ·ããããæ€èšããŠãã ãã
ãŠãŒã¶ãŒã¯Kerberosãã±ããã䜿çšããŠãã°ã€ã³ããããŒããŒãã€ã³ã¿ã©ã¯ãã£ãèªèšŒãå®è¡ããå¿ èŠããããŸãã pam_duoã¢ãžã¥ãŒã«ã¯æ£åžžã«æ¥ç¶ãããŸããæåããå Žåã PAM_PERMITãžã®ç§»è¡ã¯ãä»ã®ãã¹ãŠã®ããªãšãŒã·ã§ã³ã§PAM_DENYã«ç¶ããŸãã ãã¹ãŠãéåžžã«ç°¡åã§ãã
ãã°ã€ã³ããã¹ã¯ãŒãã§ä¿è·ãããŠããå Žåã¯ã©ããªããŸããã pam-modulesã®åãã¹ã¿ãã¯ãæºãããŸãããpam_duoãåæåã§ããã PAM_ABORTãè¿ãããŸãã ãªããªã abort = ignoreãšæžãããŠããŸããäœã®åœ±é¿ããããŸãããå¶åŸ¡ã¯æ¬¡ã®pam_unixã¢ãžã¥ãŒã«ã«æž¡ãããŸãã ãã¹ãŠãé 調ã§ããã°ã第2段éãžã®ç§»è¡ãè¡ãããŸã-ããŒããŒãã€ã³ã¿ã©ã¯ãã£ãã§ãäžèšã®ã¡ã«ããºã ãç¹°ãè¿ãããŸãã
ã¯ãããã¹ãŠã倧äžå€«ã®ããã§ãã ãããããã¥ã¢ã³ã¹ããããŸãã
pam_duoã䜿çšãããšãè¿œå ã®èšå®ãæå®ã§ããŸãïŒèªèšŒãå¿ èŠãªãŠãŒã¶ãŒãšèªèšŒãäžèŠãªãŠãŒã¶ãŒïŒã
duo.com/docs/duounix#duo-configuration-options
ãã®ãããªæ§æã®äŸã次ã«ç€ºããŸãã
groups = users,!wheel,!*admin
ãããŠããã¹ãã®çµæãäœãããããŸãããïŒ äŸã«ãããšããŠãŒã¶ãŒãwheelã°ã«ãŒãã«å±ããŠããå Žåãã¢ãžã¥ãŒã«ã¯PAM_SUCCESSãè¿ããŸãããããã¯ããªãè«ççã§ãã ããããããã¯ã¢ãžã¥ãŒã«ã®åæåãè©Šã¿ãåã«ãã€ãŸããã¹ã¯ãŒã段éã§ãæ»ããŸãã ãããã£ãŠããã®ãããªãŠãŒã¶ãŒã®ãã°ã€ã³ãç¥ã£ãŠããå Žåã2çªç®ã®èŠçŽ ããã€ãã¹ããã ãã§ãªãããŠãŒã¶ãŒã®ãã¹ã¯ãŒãããç¥ããªããŠãã·ã¹ãã ã«ãã°ã€ã³ã§ããŸãã äžè¬çã«ãå®å šãªé害ã
2çªç®ã®æ©èœããããŸãã pam.d / sshdã§ã¯ãªããéåžžã¯ä»ã®ã¢ãžã¥ãŒã«ã§æ¥ç¶ãããã°ããŒãã«èšå®ã§ããpassword-authã®èšå®ãå€æŽãããšãããŒã«ã«ã³ã³ãœãŒã«ãä»ãããã°ã€ã³ãçºçããã¢ãžã¥ãŒã«ãã€ã³ã¿ã©ã¯ãã£ããªçžäºäœçšã§æ¥ç¶ã§ããããã«ãªããŸãã ã€ãŸããæ€èšŒã®æåã®æ®µéãã¹ãããããã2çªç®ã®èŠçŽ ãããã«ãã§ãã¯ãããŸããããã§ã¯ãäŸå€ã°ã«ãŒãã§ã¢ã«ãŠã³ãåãç¥ãããšãã§ããŸãã ããã倱æã§ãã
ãã¡ã€ã«ã®ãã¡ã€ãã©ã€ãº
ããããåŸæ»ãã¯ã§ããªãããããœãŒã¹ã³ãŒãã®èªã¿åããéå§ããŸãã
ãã¹ãŠã®ãã§ãã¯ãè¡ãããã¡ã€ã³ãã¡ã€ã«ïŒ
github.com/duosecurity/duo_unix/blob/master/pam_duo/pam_duo.c
pam_sm_authenticateé¢æ°ã«èå³ããããŸã ã ãœãŒã¹ã調ã¹ããšãã¢ãžã¥ãŒã«ãšã¢ãžã¥ãŒã«ãåŒã³åºãã¢ããªã±ãŒã·ã§ã³ïŒãã®å Žåã¯sshdïŒã®éã§ããåãããé¢æ°ãåŒã³åºãããšãã§ããããšãããããŸãã
man7.org/linux/man-pages/man3/pam_get_item.3.html
man7.org/linux/man-pages/man3/pam_conv.3.html
çŽ5ã€ã®ã»ã°ã¡ã³ããŒã·ã§ã³éåïŒãã¹ãäžããã³åºå®ã¢ãžã¥ãŒã«ã®æ¥ç¶äžïŒã®åŸããã¹ã¯ãŒããšããŒããŒãã€ã³ã¿ã©ã¯ãã£ãã®å Žåã«ã©ã®ãã©ã¡ãŒã¿ãŒãç°ãªããã確èªããŸãã ãã¹ãã¯ãæå®ãããæ©èœã䜿çšããŠã®ã£ãããåŒãåºãããšè©Šã¿ãŸããã pam_convæ§é äœã®respãžã®ãã€ã³ã¿ãŒã¯ãæåãããš0ã«ãªããŸãã
ãã®çµæã2ã€ã®æ©èœãå®è¡ããå€æŽããããœãŒã¹ãååŸããŸããã¢ãžã¥ãŒã«ããã¹ã¯ãŒãã¹ããŒãžã§æ¥ç¶ããããšã PAM_AUTHINFO_UNAVAILãè¿ãããŸãã ãŸãããµãŒãã¹åãsshdãšç°ãªãå Žåã¯ã PAM_AUTHINFO_UNAVAILãè¿ããŸãïŒããŒã«ã«ã³ã³ãœãŒã«ãããã°ã€ã³ããéã®äžèšã®ç¶æ³ãåé¿ããããïŒã
gist.github.com/videns/5348e3cc04fbce3a8c26fe3c99a61b50/revisions
ããŠããã¹ãŠã®ãµãŒããŒãžã®ã€ã³ã¹ããŒã«ã®å©äŸ¿æ§ã®ããã«ãããšãã°åãfpmã䜿çšããŠããã±ãŒãžãåéããŸãã
å€æŽããã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããåŸãpam.d / sshdã«ææ°ã®å€æŽãå ããå¿ èŠããããŸãã
auth [success=2 authinfo_unavail=ignore default=1] /lib64/security/pam_duo.so auth [success=1 default=ignore] pam_unix.so nullok_secure auth requisite pam_deny.so auth required pam_permit.so
ãã®çµæãã¢ãžã¥ãŒã«ãããŒããŒãã€ã³ã¿ã©ã¯ãã£ãã¹ããŒãžã§æ¥ç¶ãããŠããªãå Žåãå¿çPAM_AUTHINFO_UNAVAILãè¿ãããã¹ã¿ãã¯ã§åŠçãããŸãã ä»ã®ãã¹ãŠã®ãªãã·ã§ã³ã§ã¯ãæåãããšpam_denyãŸãã¯pam_permitã«ç§»è¡ããŸãã
ãŸãããµãŒãã¹ã§äœ¿çšããããããã£ãŠäžåºŠã«1ã€ã®ãã¡ã¯ã¿ãŒãå ¥åããå¿ èŠãããã¢ã«ãŠã³ãã«ã€ããŠã¯ãsshdæ§æã®Matchãã©ã¡ãŒã¿ãŒã䜿çšããŠåå¥ã®èšå®ãè¡ãããšãã§ããŸãã
èŠçŽãããšãéåžžã«åªãããœãªã¥ãŒã·ã§ã³ã§ãã£ãŠãããŠãŒã¶ãŒã次ã®ããã«ãªããªãããã«ããã¡ã€ã«ãå°ãå€æŽããå¿ èŠãããå Žåãå€ããšèšããŸãã
ãŸãã2èŠçŽ èªèšŒã«é¢ãã詳现æ å ±ãå ±æããæºåãã§ããŸãããããšãã°ãã¬ãŒãã¯çµ±åæã«ååšããŠãããââãduosecurityãããã€ããŒã®èå³æ·±ãæ©èœã説æãããããŸãã