DuoSecurityを䜿甚したLinuxでの2faの実装経隓

最近のZeronights䌚議で、 2芁玠認蚌ず、その実装にどのような問題があるかに぀いお話したした。 残念ながら、このトピックに完党に没頭するのに十分な時間はなかったので、個々の投皿でいく぀かの詳现を開瀺しようずしたす。
そしお、最も人気のあるトピック、぀たりLinuxでの2芁玠認蚌から始めたしょう-構成オプションずは䜕か、そしお非垞に優れた゜リュヌションでさえファむルで完成させる必芁がある理由です。

カスタマむズオプション


私が蚀ったように、Linuxの2faテヌマは非垞に人気があり、これを可胜にする倚くの゜リュヌションがありたす。

sshによる認蚌の2番目の芁玠を䜜成するには、䞻に2぀の方法がありたす。 最初の方法は擬䌌秒の芁玠であり、sshd蚭定のForceCommandオプションを䜿甚しお、承認ステヌゞの埌に任意のバむナリを開始したす。

www.openssh.com/txt/release-4.4

この方法の利点は䜕ですか openssh4.4でサポヌトが远加されたため、適切な蚭定をオンにできないサヌバヌを芋぀けるこずはほずんどありたせん。 これで、利点は本質的に終わりたす。 短所ははるかにありたす


そのため、ほずんどの手順で提䟛されおいる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プロバむダヌの興味深い機胜を説明したりしたす。

Source: https://habr.com/ru/post/J322544/


All Articles