Rustで実装したPAMモジュールを利用してGoogle OAuth認証でSSHを多要素認証する

以前開発した、SSHログインの認証時にGoogleのOAuthを利用して認証を行うPAMモジュールをRustで再実装しました。

以前Golang + C言語で実装したものは下記のエントリにあります。

モチベーション

以前開発したものは開発当初の実装が、Golangで開発したCLIコマンドを、sshdの ForceCommand ディレクティブからコールするというコンセプトから始まり、それだと踏み台として利用した場合に、パススルーされる問題があったことから、CLIをPAMから呼び出すという実装にしたため、インストールが煩雑であったり、そもそも利用しづらいとうことがありました。それらの問題を解消するのと、自身の学習のために、Rustを利用して、PAMモジュールから直接Google OAuth認証できるようにしました。

動作イメージ

アニメーションではパスワード認証を利用していますが、他にも公開鍵認証+OAuthのように複数の認証方式を組み合わせることができます。これによってパスワードや秘密鍵が流出したとしても、攻撃者からのログインが困難になります。

インストール方法

curlコマンドでシュッとインストールできます。

$ curl -s https://pam-google-web-oauth.lolipop.io/install.sh | bash -

OAuthに利用するClienntIDとClientSecretは、OAuth 2.0 の設定 を参考にGoogleの認証情報を作成し、下記のようにoAuthクライアントを払い出してください。

最後に

今回はじめてRustを触ったのですが、ResultやOptionを利用したパターンマッチングや、ジェネリクス、生存期間、トレイとなどこれまで触ってきた言語で自身が扱わなかった領域の技術があっため、最初はかなり苦労したのですが、手を動かしつつ、GitHubで類似実装をみたり、書籍を読みすすめることで理解を深めることができました。よく言われることですがC言語で起きがちなメモリ管理の実装ミスなどがコンパイラのレベルで色々気づけたり、Golangに近い言語レベルで各種ユーティリティが揃っているのはとてもいいなと思いました。

今の会社で行う業務で低レイヤーのプログラミングはまだまだ機会があると思うので、次はもう少し大きい規模のコードを実装してみたいと思った。