【第11回】目指せLinuxマスター(3) ~polkitの設定~

 皆さん,こんにちは.迷子のエンリュです.

 今日はpolkitの設定をやっていきます.Polkitは,GNOMEなどのデスクトップ操作の権限を設定するセキュリティツールで,ポリシーという形でユーザーごとに操作の権限を定義することができます.

 前回はPAMというセキュリティツールを覗きながら,実行ファイルのアクセス権限を変えることでユーザーのコマンド実行の権限を調節しました.これによって非ユーザーCUIからシャットダウンするのを完全に禁止できましたね.しかしGUIを使えばシャットダウンできてしまいます.それはなぜかというと,GUIの場合はまた違ったモジュールがセキュリティの管理を行っているからなんですね.面倒くさい限りです.

 GUIベースで共用マシンを動かすケースを考慮して,その管理方法の基本となるPolkitを使いこなせるようになりましょう.

 それではよろしくお願いいたします.

どうしてPolkitなのか

ログを見てみる

 さて,そもそもどうやってPolkitなるものにたどり着いたらいいのか.そこから話したいと思います.Linuxは大体の場合,なにか操作を実行したらログが残ります.「プログラムは正常に終了しましたよ」とか「認証をクリアしましたよ」とかですね.

 例えば,Aliceという非usersユーザーでログインし,GUIから再起動してみましょう.System > Shut Down... > Restartですね.

 今度はwheelユーザーのenryuでログインし,ターミナルを立ち上げます.主なログは/var/logというディレクトリに入っています.ここでは/var/log/secureという,認証に関するログの最後の方を見てみましょう.

$ sudo tail -n 20 /var/log/secure | less

f:id:LostEnryu:20161029105339p:plain

 ...え?これ読むの?  ちょっと頭痛くなってきますね.でも見るところが分かってこれば,大して苦ではないんですよ.例えば一番下,enryuがsudoを行ったログがあります.最初は日付,次はホスト名です.まずこれを見て関係なさそうなのは排除できます.ホストの次に書かれているのがサービス名です.正直これだけ見てれば大体の流れは追えます.

 Shift+gでファイルの末尾に移動したら,kで上に戻りながらaliceという文字を探しましょう.すると,pam: gdm-password: pam_unix(gdm-password:session): session closed for user aliceという行があるでしょう.これがaliceによるシャットダウンの行ですね.gdmというのは"GNOME Display Manager"の略で,GUIのログイン処理などを行っています.

 その次の行には,polkitdというサービスが書かれています.gdmはpolkitdを使って認証を行っているのです.下の方には/org/freedesktop/ConsoleKit/Session1や/org/gnome/PolicyKit1/AuthenticationAgentなどの文字も見えますね.

manで調べる

 関係者が割り出せたところで,manで調べてみましょう.polkitについて見てみると,

f:id:LostEnryu:20161029105354p:plain

とあります.PolicyKitは認証APIを提供するとありますから,今日の標的はこいつのようですね.もう少し下まで見てみると,

f:id:LostEnryu:20161029105409p:plain

このような文があります.ローカル権限を設定したいいならpklocalauthorityというやつを調べろとのお達しですね.早速見てみましょう.qでmanを閉じたら,すかさずman 8 pklocalauthorityと入力します.

f:id:LostEnryu:20161029105422p:plain

 これを読んでいくと,設定ファイルは/etc/polkit-1/localauthority/以下に.pkla拡張子をつけて書いてくれとあります.さらに,設定ファイルの書き方についても記述があります.

f:id:LostEnryu:20161029105441p:plain

 いやあ,親切ですね.ResultAnyというのがデフォルトの挙動,ResultInactiveがアクティブでないローカルセッションに対する挙動,ResultActiveがアクティブなローカルセッションに対する挙動...ということですが,よく分かりませんね.アクティブってなんなんでしょう.ここではResultActiveで許可が出せるんだと思っておけば良さそうです.

Actionを調べる

 では今度はシステムのシャットダウン・再起動に関わるアクションを調べてみましょう.pkactionコマンドを使います.

$ pkaction | grep restart
$ pkaction | grep consolekit
$ pkaction -v -a org.freedesktop.consolekit.system.restart

f:id:LostEnryu:20161029105504p:plain

f:id:LostEnryu:20161029105522p:plain

 ありましたね.どうやらorg.freedesktop.consolekit.system以下の4つのアクションについて設定してやれば良さそうです.

設定を記述

localauthorityへの追加

 やることが分かってきたところで,早速設定ファイルを追加していきましょう./etc/polkit-1/localauthorityへの侵入権限がないらしいので,途中まで入ったらsudoで設定ファイルを作りましょう.なお,cdはコマンドではないため,sudo cdとすることはできません.

$ cd /etc/polkit-1
$ sudo vi localauthority/50-local.d/myConsoleKitSystem.pkla

 例えばこんな感じで書いて保存してみます.

[ConsoleKit]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.*
ResultAny=no
ResultInactive=no
ResultActive=no

 ではGUIのシャットダウンウィンドウを表示してみましょう.

f:id:LostEnryu:20161029105555p:plain

 なんと,Shut DownとRestartが見事に消えてしまいました!  どうやら,この方針で間違いないようです.

 では,今度はusersだけに許可を与えてみましょう.

[ConsoleKit]
Identity=unix-group:users
Action=org.freedesktop.consolekit.system.*
ResultAny=no
ResultInactive=no
ResultActive=auth_self_keep

 念のために各自のパスワードを入力させるようにしました.それでは再起動をしてみましょう.

f:id:LostEnryu:20161029105624p:plain

 パスワードの入力が求められました.

 今度はaliceでログインしてみましょう.今はaliceには何も規制がかかっていませんね.おそらく従来通りに再起動できる状態でしょう.

ポリシーのデフォルトの変更

 aliceをはじめとした非usersの規制をするには,先ほどのmyConsoleKitSystem.pklaの最初に,全ユーザー向けの設定を記述すればいい気がしますが,どうもそれだとうまく機能してくれません(似たようなことをしようといている投稿も見られましたが(polkit: disable all users except those in group wheel?),users以外の全ユーザーを書く方法しかうまくいかなさそうなので,ここではデフォルトの設定を変えてしまいます.これはあまり推奨されない方法です.アップデートの際に書き換えられてしまうので...  Polkitの更新の際は注意しましょう.

 デフォルト設定は/usr/share/polkit-1/action以下で定義されています.pkactionで見られるような設定が書かれています.

$ cd /usr/share/polkit-1/action
$ ls

f:id:LostEnryu:20161029105717p:plain

 シャットダウン関係のポリシーはorg.freedesktop.consolekit.policyになります.root権限でlessコマンドで見てみましょう.

$ su
# less org.freedesktop.consolekit.policy

f:id:LostEnryu:20161029105655p:plain

 上の方はxmlファイルのおまじないです.<policyconfig>以下のタグがActionの設定です.これを見ると,allow_inactive,allow_activeなどのタグがありますね.これがResultActiveなどで設定した値のデフォルト値です.これを変えていくわけですね.

 lessは,vを押すことで編集モードに移ることができます.デフォルトはviが起動しますが,設定を変えれば好きなエディタを起動することができます.早速vでviエディタを起動しましょう.

 /allow_activeとして検索を行い,そのタグに囲まれた「yes」や「auth_admin_keep」などの値をすべて「no」に書き換えてしまいましょう.このファイル中には全部で4か所あります.

 できたら:wqでviを終え,lessに戻り,qでlessも終わりましょう.これで設定完了です.

 aliceやbobなど,ユーザーを切り替えてGUIからシャットダウンしようとしてみてください.いかがでしょうか.設定がうまくできていることが確認できるかと思います.

まとめ:CUIGUIでのユーザーのシャットダウン権限

 第9回から3回にかけて,シャットダウンに関する権限の設定を行ってきました.ちょっと何をやったか分かんなくなってきましたね.ここらで少しまとめてみましょう.

CUIのシャットダウン権限

  • 基本的にシャットダウンコマンドにはroot権限が必要
  • sudoersの設定を変更してsudoコマンドによるシャットダウンを特定ユーザーに許可
  • 物理コンソールログインに限り,consolehelperによって一般ユーザーにシャットダウン権限を委譲
  • consolehelperの所有グループを変更して物理コンソールログインでシャットダウン権限を委譲されるユーザーを,特定ユーザーに限定
  • 他にもPAMを用いて認証や権限の制御が行われている

GUIのシャットダウン権限

  • GUIでのシャットダウン権限はPolkitで定義されるポリシーに従っている
  • /etc/polkit-1/localauthority以下でローカルのポリシーを設定できる
  • /usr/share/polkit-1/Action以下でデフォルトのポリシーを設定できる

 こうしてまとめてしまうと,随分簡単なことのように思えますね.これらの操作は,root権限があれば簡単にできてしまうものばかりです.つまり,せっかく一般ユーザーの操作を限定しても,suコマンドでroot権限に昇格してしまえば,システムに関わる変更もできてしまうのです.

次回

 次回は,suコマンドによるroot権限への昇格について制限していきます.これで,基本的な権限の設定は完了となります.usersメンバーでないユーザーにはシステムの設定などを一切変更できなくなります.最後の大詰め,張り切ってまいりましょう.

 次回もよろしくお願いいたします.

参考ページ

シャットダウンの権限についてこちらでまとめています

Qiita:目指せLinuxマスター(壱) ~CUI/GUIからの強制終了/再起動権限~
Previous | Top | Next

Prev: 【第10回】目指せLinuxマスター(2) ~権限の制御~

Next: 【第12回】目指せLinuxマスター(4) ~suの権限~

Index
Journey