GNOME/Keyring
GNOME Keyring は「シークレット・パスワード・鍵・証明書を保存し、それらをアプリケーションから利用できるようにする GNOME のコンポーネントのコレクション」です。
GNOME Keyring は org.freedesktop.secrets API を提供しています。これは、クライアントアプリケーションがユーザーのログインセッション内で実行中のサービスを利用してシークレットをセキュアに保管できるようにする API です。
セキュリティ
悪意のあるアプリケーションからの保護
GNOME/Keyring API の動作に関連するセキュリティの問題 (CVE-2018-19358) が過去に報告されています。いかなるアプリケーションも、キーリングのロックが解除されていれば、任意のシークレットを簡単に読むことができてしまいます。さらに、ユーザーがログインしていれば、ログイン/デフォルトのコレクションのロックは解除されています。D-Bus の保護機構 (busconfig とポリシー XML エレメントを含む) はデフォルトで使用されておらず、いずれにせよ、これも簡単にバイパスできてしまいます。
GNOME/Keyring のセキュリティモデルによれば、信頼されないアプリケーションはユーザーのセッションバスソケットへのアクセスを許可されないであろうことから、GNOME プロジェクトはこの脆弱性レポートに同意していません。
Flatpak によってサンドボックス化されているアプリケーションは、セッションバスへのアクセスがフィルタリングされています。
セッションがロックされてもキーリングはロックされません
セッションがロックされても、キーリングは自動的にロックされません。[1] これはつまり、パスワードがメモリ内に残り続け、DMA 攻撃に対して脆弱になることを意味します。
インストール
gnome-keyring は gnome グループの一部なので、GNOME を使用しているのであればすでにインストールされています。また、このパッケージは単独でインストールすることもできます。他のアプリケーションにキーリングへのアクセス権を与えるために libsecret もインストールする必要があります。libgnome-keyring は非推奨になりました (後継は libsecret です) が、それでも特定のアプリケーションで必要になる場合があります。
gnome-keyring-daemon は、ログイン時に systemd ユーザーサービスを介して自動的に開始されます。また、ソケットを介して要求に応じて開始させることもできます。
GNOME Keyring に関する追加のユーティリティは次の通りです:
- secret-tool — コマンドラインから GNOME Keyring (や DBus Secret Service API を実装する他のサービス) にアクセスします。
- lssecret — libsecret を使用してすべてのシークレットアイテム (例えば、GNOME Keyring) を一覧表示します。
GUI で管理する
GNOME Keyring は Seahorse を使って管理することができます。seahorse パッケージをインストールしてください。
キーリング (例えば、デフォルトキーリングである "Login") のパスワードは変更することが可能であり、さらには削除することも可能です。詳細は GNOME Help の Create a new keyring と Update the keyring password を参照してください。
キーリングを使用する
PAM モジュール pam_gnome_keyring.so は、GNOME キーリングを部分的に初期化し、その過程で login キーリングのロックを解除します。gnome-keyring-daemon は systemd ユーザサービスによって自動的に開始されます。
PAM の手順
ディスプレイマネージャを使用している場合、ほとんどのケースで特に設定せずともキーリングは機能します。GDM、LightDM、LXDM、そして SDDM にはすでに必須の PAM 設定が含まれています。キーリングのロックを自動的に解除しないディスプレイマネージャの場合は、以下で言及している /etc/pam.d/login
以外の適切なファイルを適切に編集してください。
コンソールベースのログインを行う場合は、/etc/pam.d/login
を編集してください:
auth
セクションの最後に auth optional pam_gnome_keyring.so
を追加し、session
セクションの最後に session optional pam_gnome_keyring.so auto_start
を追加してください。
/etc/pam.d/login
#%PAM-1.0 auth required pam_securetty.so auth requisite pam_nologin.so auth include system-local-login auth optional pam_gnome_keyring.so account include system-local-login session include system-local-login session optional pam_gnome_keyring.so auto_start
SSH 鍵
GNOME Keyring は、ssh-agent のラッパとして振る舞うことができます。このモードでは、SSH 鍵をアンロックする必要が生じた度に GUI パスワード入力ダイアログを表示します。このダイアログには、入力したパスワードを記憶するかどうか尋ねるチェックボックスが含まれています。このチェックボックスを選択すると、ログインキーリングがアンロックされている限り、今後そのキーを使用する際にパスワードを入力する必要が無くなります。
バージョン 1:46 から、gnome-keyring-daemon ビルドでは SSH の機能がデフォルトで無効化されています。この機能は /usr/lib/gcr-ssh-agent
(gcr-4 パッケージに含まれています) へと移動されています。
gcr をセットアップする
やるべきことは:
gcr-ssh-agent.socket
systemd ユーザーユニットを有効化する。gcr-ssh-agent.socket
systemd ユーザーユニットを一度開始する。これにより、ソケットファイル$XDG_RUNTIME_DIR/gcr/ssh
が作成されます。ファイルが作成されれば、最初のステップでソケットユニットが自動的に開始されるようになります。gcr-ssh-agent.socket
ユニットがアクティブである場合、SSH_AUTH_SOCK
環境変数を手動で設定する必要はないはずです。一旦ログアウトし、ログインし直せば、SSH_AUTH_SOCK
環境変数は$XDG_RUNTIME_DIR/gcr/ssh
に設定されているはずです。これは、Gnome のConsole
アプリケーションでfish
をデフォルトシェルとして使用した場合に動作することが確認されています。
環境変数を設定する方法はたくさんあります。使用するべき方法は、あなたのセットアップと好みに依ります。
使用する
以下を実行することで、実行中のエージェントにロードされている SSH 鍵をリストアップできます:
$ ssh-add -L
これにより、適切なサービスが起動されていて、SSH_AUTH_SOCK
が適切に設定されていることを確認することができます。
パスフレーズをキーリングに永続的に保存するには、seahorse パッケージの ssh-askpass を使用してください:
$ /usr/lib/seahorse/ssh-askpass my_key
他のディレクトリから SSH 鍵を手動で追加するには:
$ ssh-add ~/.private/id_rsa Enter passphrase for ~/.private/id_rsa:
手動で追加した鍵をすべて無効化するには:
$ ssh-add -D
無効化する
別の SSH エージェントを実行したい場合 (例: ssh-agent や gpg-agent)、GNOME Keyring の ssh-agent ラッパを無効化するのは良い考えです。各エージェントは異なるソケットをリッスンし、SSH_AUTH_SOCK
を使ってエージェントを選ぶことができるので、厳密には必須ではありませんが、デバッグの問題を簡単にできます。ただし、GNOME の実装は BatchMode を含む多くのスクリプト機能を実装していないことに注意してください[3]。
gcr-ssh-agent を無効化するには、gcr-ssh-agent.socket
と gcr-ssh-agent.service
を両方とも systemd で無効化・停止してください。
ヒントとテクニック
アプリケーションとの統合
キーリングをロックする
$ dbus-send --session --dest=org.freedesktop.secrets \ --type=method_call \ /org/freedesktop/secrets \ org.freedesktop.Secret.Service.Lock \ array:objpath:/org/freedesktop/secrets/collection/login
このコマンドは D-Bus メソッドを呼び出して login キーリングをロックします。これとは別に GUI を使いたい場合は、Seahorse でキーリングをロックすることもできます。
パスフレーズの消去
$ gnome-keyring-daemon -r -d
このコマンドは、gnome-keyring-daemon を開始し、以前の実行中のインスタンスを終了します。
Git 統合
GNOME Keyring は、HTTPS 経由でプッシュするときに Git と一緒に使うと便利です。この機能を使用するには、libsecret パッケージがインストールされている必要があります。
libsecret ヘルパーを使うように Git を設定してください:
$ git config --global credential.helper /usr/lib/git-core/git-credential-libsecret
これで、次回 git push
を実行したときに、キーリングがまだ解除されていない場合に解除するよう要求されます。
GnuPG 統合
GnuPG を使用するいくつかのアプリケーションは、pinentry-program
が設定されていることを要求します。GNOME 3 pinentry for GNOME Keyring を使用してパスフレーズのプロンプトを管理するようにするには、以下を設定してください:
~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-gnome3
もう一つのオプションは、GPG のループバックを強制することで、アプリケーションでパスフレーズを入力できるようにすることです。
キーリングの名前変更
キーリングの表示名 (つまり、Seahorse や file
で表示される名前) は、暗号化されていないキーリングファイル内で display-name の値を変更することで、変更することができます。キーリングは通常、~/.local/share/keyrings/
内に .keyring という拡張子が付けられて保存されています。
キーリングのパスワードをユーザのパスワードへ自動的に変更する
/etc/pam.d/passwd
の末尾に password optional pam_gnome_keyring.so
を追加してください:
/etc/pam.d/passwd
... password optional pam_gnome_keyring.so
デスクトップ環境 (KDE、GNOME、XFCE など) の外で gnome-keyring-daemon を使う
起動する
sway や i3、または以下のファイルを実行しないウィンドウマネージャを使用している場合:
/etc/xdg/autostart/gnome-keyring-*.desktop
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh
ウィンドウマネージャの起動時に以下のコマンドがウィンドウマネージャによって実行される必要があります。以下のコマンドを何らかの特定の順序で実行する必要はありません。
dbus-update-activation-environment DISPLAY XAUTHORITY WAYLAND_DISPLAY
または
dbus-update-activation-environment --all
このコマンドは、環境変数をウィンドウマネージャから dbus セッションに渡します。これがないと、DBus 経由で GUI プロンプトをトリガーできません。例えば、これは seahorse のパスワードプロンプトで必要です。
これが必要になるのは、グラフィカル環境が開始される前に dbus セッションが開始されるからです。したがって、dbus セッションは、あなたがいるグラフィカルな環境について知らないのです。誰か、または何かが、グラフィカル環境を記述する環境変数を dbus に渡すことで、グラフィカルな環境について dbus セッションに教えなければなりません。
gnome-keyring-daemon --start --components=secrets
ログイン時に PAM は gnome-keyring-daemon --login
を実行します。これにより、gnome-keyring がログインパスワードによってアンロックされた状態になります。もし gnome-keyring-daemon --login
が数分以内に dbus セッションに接続されなければ、gnome-keyring-daemon --login
は終了します。gnome-keyring-daemon --start ...
がウィンドウ・マネージャ内で dbus セッションに対して起動されると、gnome-keyring-daemon --login
は dbus セッションに接続されます。ログインセッションが gnome-keyring-daemon --start ...
を開始する前に gnome-keyring-daemon --login
が終了すると、gnome-keyring や secret service API を使用するプログラムも使えなくなってしまいます。
GNOME Keyring XDG Portal
GNOME Keyring は、flatpak などによってサンドボックス化されたアプリケーションのために XDG Portal のバックエンドを公開しています。GNOME の外でこれを機能させるには、設定ファイル /usr/share/xdg-desktop-portal/portals/gnome-keyring.portal
の UseIn
キーにデスクトップ環境の名前を追加する必要があります。例えば、sway を追加するには:
/usr/share/xdg-desktop-portal/portals/gnome-keyring.portal
[portal] DBusName=org.freedesktop.secrets Interfaces=org.freedesktop.impl.portal.Secret UseIn=gnome;sway
XDG Desktop Portal のバックエンドに関する詳細は XDG デスクトップ ポータル#バックエンド を参照してください。
トラブルシューティング
パスワードが保存されない
ログインするたびにパスワードプロンプトが表示され、パスワードが保存されない場合は、デフォルトのキーリングを作成/設定する必要がある場合があります。Seahorse (別名、パスワードと鍵) を使ってこれを行う方法については、GNOME Help の Create a new keyring と Change the default keyring を参照してください。
キーリングのリセット
"The password you use to login to your computer no longer matches that of your login keyring" といったエラーメッセージが表示される場合は、ログインキーリングのパスワードを変更する必要があります。
または、~/.local/share/keyrings/
から login.keyring
ファイルと user.keystore
ファイルを削除することもできます。これらのファイルを削除すると、保存されている全鍵が永久に削除されるので注意してください。これらの削除したら、一旦ログアウトし、ログインし直してください。
Unable to locate daemon control file
ログイン後に以下のエラーが journal に表示される場合:
gkr-pam: unable to locate daemon control file
関連する他の問題が発生していないのであれば、このメッセージは「安全に無視することができます」[4]。
No such secret collection at path: /
Seahorse で新しいキーリングを追加しようとすると、以下の理由によりこのエラーが発生することがあります:
~/.local/share/keyrings/
ディレクトリが存在しない。この場合、このディレクトリを作成してください。- カスタムの
~/.xinitrc
が使用されている。これは以下の行を追加することで解決します[5]:
~/.xinitrc
source /etc/X11/xinit/xinitrc.d/50-systemd-user.sh
ターミナルに "discover_other_daemon: 1" というメッセージが表示される
これは gnome-keyring-daemon が複数回起動されたことが原因です。Systemd サービスが gnome keyring のデーモンと一緒に提供されるため、別の方法で起動する必要はありません。そのため、.zshenv
、.bash_profile
、.xinitrc
、config.fish
、その他の似たような場所から gnome-keyring-daemon を起動するコマンドを削除してください。あるいは、gnome-keyring-daemon.service
と gnome-keyring-daemon.socket
ユーザーユニットを無効化することもできます。
キーリングの不適切な初期化
これによる症状としては:
- SSH や Git といったプログラムが、キーリングからパスワードが提供されるのを待機する間、ハングアップする。最終的には "agent refused operation" といったエラーでタイムアウトします。
- Seahorse でキーリングが何も表示されない。"login" という名前のキーリングを手動で作成しても何も起こらないに見える。
- 次のようなエラーメッセージが Seahorse の出力に現れる:
couldn't load all secret collections: No such secret collection at path: /org/freedesktop/secrets/collection/login
これを解決するには、以下を行ってください:
gnome-keyring-daemon.service
systemd ユーザーユニットを再起動する。これにより、login キーリングが適切に初期化されるはずです。gcr-ssh-agent.service
systemd ユーザーユニットを、使用しているのであれば、再起動する。他のエージェントも再起動する必要があるかもしれません。
これで治らない場合は、キーリングを再設定することを検討してください。