みなさん、こんにちは。
Raspberry PiをIoTシステムのエッジ端末として利用する場合、リソースの有効活用を重視してGUIを立ち上げず、CUI環境で運用するケースも多いことでしょう。
今回の記事は、そんなCUI自動ログイン環境でのセキュリティ対策にフォーカスしたTipsをご紹介します。
具体的には、TTYログインを許可せず、SSHによるリモートログインのみを許可する設定のご紹介です。
PulseAudioなど、ユーザーがログイン状態でなければ自動起動しないシステムアプリケーションを扱う際、HDMI接続のディスプレイにログイン状態が常時表示されると、誰でも直接操作できるリスクがあるため、SSHによるリモートログインのみを許可する設定が有効です。
対策の概要
今回ご紹介する対策は、CUI環境において自動ログインが設定されているユーザーのシェル起動時に、TTY(直接ログイン)の場合は警告メッセージを表示して自動的にログアウトさせるというものです。
これにより、リモートのSSHセッションは通常通り利用でき、HDMI接続ディスプレイでの直接ログインによる不正アクセスのリスクを軽減できます。
設定方法
自動ログインしているユーザーのホームディレクトリにある .bashrc ファイルに、以下のコードを追加してください。
# prohibit tty login
if [[ -z "$SSH_CLIENT" ]] && [[ -z "$SSH_TTY" ]]; then
echo "Logging in via TTY is prohibited. Press any key to continue..."
read -n 1 -s
exit
fi
このコードの動作は以下の通りです。
- TTY経由の場合
環境変数SSH_CLIENT
およびSSH_TTY
が空の場合、SSHによるリモートログインではなく、HDMI接続のディスプレイ上のTTYからのログインと判断し、警告メッセージを表示します。
キー入力後にシェルを終了(ログアウト)するため、ディスプレイ上での操作を防ぎます。 - SSH経由の場合
SSHセッションでは、上記変数に値が設定されるため、通常通りシェルが起動し、リモート作業が可能です。
ログイン状態に依存するその他のシステムアプリケーション
PulseAudio以外にも、ユーザーのログイン状態が前提となっているシステムアプリケーションは多数存在します。たとえば次のようなアプリケーションです。
- gnome-keyring
ユーザーの認証情報や鍵管理を行うこのデーモンは、ログイン時に自動的に起動します。ログイン状態が維持されないと、認証関連の機能が利用できなくなる可能性があります。 - DBusセッションバス
多くのデスクトップアプリケーションやユーザーサービスは、DBusセッションバス上で連携を行っています。ログインしていないとこのセッションが初期化されず、各種サービス間の通信が成立しなくなる恐れがあります。 - systemdユーザーサービス
ユーザー単位で管理されるサービス(systemd –userユニット)も、ログイン時に起動する仕様のため、ログイン状態が保持されなければ機能しません。
これらの例からも分かるように、ユーザーのログイン状態はシステムの各種機能の起動に深く関わっています。
自動ログイン状態を維持しつつ、TTYログインを禁止すれば、必要なアプリケーションはSSHなどのリモートセッションのみで管理運用できる環境を構築できます。
注意点
- 設定ファイルの違い
環境によっては、シェルの初期化ファイルが.bashrc
以外(例:.bash_profile
や.profile
)である場合もあります。ご利用の環境に合わせて同様の設定を適用してください。 - セキュリティの限界
本手法は簡易的な対策です。ディスプレイにログイン状態を表示しないようにする目的では有効ですが、システム全体のセキュリティ強化の一環として、他の保護策と併用することをおすすめします。
まとめ
Raspberry Piで常時稼働するIoTシステムを開発する際、リソースの有効活用を重視してGUIを立ち上げずCUI環境で運用するケースは多く見受けられます。
今回ご紹介した設定は、CUI自動ログイン環境下でのセキュリティ対策として、HDMI接続ディスプレイからの直接ログインを防ぎ、SSH経由での安全なリモートアクセスを実現するためのものです。
PulseAudioに加え、gnome-keyring、DBusセッションバス、systemdユーザーサービスなど、ログイン状態に依存する各種システムアプリケーションを使用する際に有用です。ただし、簡易的な対策ですので、他の保護策と併用し、より安全で効率的なIoTシステムの運用を目指しましょう。
今回も最後までお読みいただきありがとうございました。
それでは、よいIoTライフを!