はじめに
サイバーセキュリティエンジニアとして、私は常にソフトウェアシステムのセキュリティを向上させる方法を探しています。この記事では、プラグ可能な認証モジュール(PAM) EXECの機能を使ってLinuxシステムでパスワードをログする方法を探ります。この手法には正当な使用ケースがありますが、適切に処理されない場合はセキュリティの脆弱性につながる可能性があるため、慎重に使用する必要があります。
PAMとは何ですか?
PAMはプラグ可能な認証モジュールで、サービスがローカルのLinuxデータベースに対して認証できるようにします。PAMはログインや認証のタスク(パスワードハッシュ、ユーザーグループ、シェル情報の確認など)を処理するためのAPIを提供します。PAMは/etc/pam.d
ディレクトリ内のスクリプト(例えばcommon-off
やpam_shells
)で設定されています。
PAM EXECの紹介
PAM EXECは、認証プロセス中に外部コマンドを実行できるモジュールです。PAM EXECは、認証トークン(パスワード)をスタンダード入力に公開し、リモートホスト、ユーザー、サービスといった環境変数も提供します。発表者は、SMBシェアのマウントやiptables
コマンドの実行など、PAM EXECの正当な使用ケースについて説明しますが、これらのユースケースは専用のライブラリやツールで対応することが多いでしょう。
Bashスクリプトでパスワードをログする
発表者はBashスクリプトを作成し、日付、PAMユーザー、パスワードを/var/log/passwords.log
ファイルにログします。このスクリプトは/etc/pam.d/common-off
ファイルの先頭に追加され、認証プロセス中に確実に実行されるようになります。発表者はさまざまなパスワードでログインをテストし、ログファイルが適切に更新されることを確認しました。
Golangによるロガーの実装
発表者はパスワードロガーをGolangで再実装することにしました。Golangなら単独のバイナリを作成できるためです。Golang実装ではzerolog
ライブラリを使ってパスワード情報をJSONフォーマットでログします。Bashスクリプトがsudo
やsu
コマンドの成功ログを記録できないという問題を、Golang版で解決しました。
Golangロガーの機能拡張
発表者はGolangロガーに、認証が成功したか失敗したかを検出する機能を追加しました。ロガーは新しい行を追加するのではなく、最後の行を成功または失敗のステータスに置き換えるようになりました。発表者はこの拡張されたロガーをテストし、成功および失敗した認証試行を正しくログできることを確認しました。
まとめ
この記事では、LinuxシステムでパスワードをログするためにPAM EXECの機能を使う方法を探りました。この手法には正当な使用ケースがありますが、適切に処理されない場合はセキュリティの脆弱性につながる可能性があるため、慎重に使用する必要があります。サイバーセキュリティエンジニアとして、より強固なセキュリティ保証と最良の実践に従う代替ソリューションを探ることをお勧めします。
ポイント:
- PAMはローカルのLinuxデータベースに対してサービスを認証できるプラグ可能な認証モジュールです。
- PAM EXECは、認証プロセス中に外部コマンドを実行できるモジュールで、認証トークン(パスワード)を公開します。
- 発表者はBashスクリプトとGolang実装でPAM EXECを使ってパスワードをログしました。
- Golang実装ではBashスクリプトの問題を解決し、成功および失敗した認証を検出する機能を追加しました。
- PAM EXECには正当な使用ケースがありますが、セキュリティの脆弱性を避けるため、慎重に使用する必要があります。