いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.221 / 読者数:2137名

オヒサシブリデース、うすだです。

…申し訳ございません。
前回発行予定日は 5/20(日) でしたが、すっぽかしてしまいました。

黄金週間前後から、己れの段取りと能力の低さにより、 お仕事がたいへんなことになっておりました。
ほとんどすべてとっぱらっていただいた(他の方々へ引き継いだ)ことで、 ようやく普通の(隠居な?)生活に戻ってきております。

転職してから1年半弱になりますが、その間、今までの自分の仕事のやり方と、 今の会社の仕事のやり方とのギャップに、戸惑い続けてきました。

会社によって仕事の内容は異なり、いろいろあった末、 その会社にあったやり方が確立されているのだと思います。
ですので、まずはそのやり方をマスターすべきだ、 ということはわかっている…つもりでした。

ですが、自分が今までやってきて、 それなりにうまくいくことがわかっているやり方があると、 どうしてもそれにすがってしまうようです。
(己れのパラダイムをシフトさせるのは、思った以上に難しいですね。)

まあ、困ったときが学ぶとき(by 斎藤一人さん(たしか…))だと思って、 自分の偏った視点だけで考えてクサクサせず、広い視野で考えていきたいと思います。 (目先だけでなく将来のこともちゃんと考えて…。)

なんとか前向きになったところで、今回もはりきってまいりますよ!

今回のお題 - AppArmor を使ってみる

1ヶ月ぶりとなる当メルマガですが、前回は、 AppArmor のおおまかな動作原理っぽいことをお知らせしました。

Vol.220 - AppArmor をおおまかに理解する
http://www.usupi.org/sysad/220.html

ですが、「実践」と銘打っているからには、 実際に使ってみないことには話になりません。そこで今回は、 AppArmor を実際に使ってみましょう。

そのための、本日のラインアップは以下の通りです。

  • プロファイル
  • 2つのモード (Enforce と Complain)
  • Complainモードにして学習する
  • Enforceモードに移行して本格稼働する

また、以下は、Ubuntu 12.04 でのみ確認しております。
(openSUSE でもおそらくほぼ同じだと思いますが…。)

AppArmor のプロファイルについて

前回、AppArmor はプログラム毎にMAC(強制アクセス制御)を行う機構だよ〜的なことを申し上げました。

AppArmor のプログラム毎の設定は、プロファイルと呼ばれるもので行います。 前回もさらりと書きましたが、「/etc/apparmor.d/」以下に置いてあります。

書いてある内容は、ケーパビリティやネットワークアクセス、 各パスへのアクセス許可などです。
…と文字だけでお知らせしても仕方ないので、実際に眺めてみましょう。
以下では、/usr/sbin/slapd 用のプロファイルをcatコマンドで参照しています。

  $ cat /etc/apparmor.d/usr.sbin.slapd
  # vim:syntax=apparmor
  # Last Modified: Fri Jan  4 15:18:13 2008
  # Author: Jamie Strandboge <jamie@ubuntu.com>
  #include <tunables/global>

  /usr/sbin/slapd {
    #include <abstractions/base>
    #include <abstractions/nameservice>
  ...中略...

    capability dac_override,
    capability net_bind_service,
  ...中略...

    /etc/ldap/** kr,
    /etc/ldap/slapd.d/** rw,
    /dev/tty rw,
    /etc/krb5.keytab kr,
    /{,var/}run/slapd/* w,
    /{,var/}run/nslcd/* w,
  ...中略...

    #include <local/usr.sbin.slapd>
  }

まず、プロファイルのファイル名ですが、 絶対パスの間の「/」を「.」に置き換えたものになっています。

そして、基本的には「#」で始まる行はコメントです。
ただし、「#include」で始まる行は、そのファイルを読み込むという意味です。 最初に #include で指定したファイルには、すべてに共通の設定が書かれています。

で、もうちょっと読み進めていくと、「/usr/sbin/slapd {」という行があります。 ここからが、/usr/sbin/slapd の設定内容になります。

その直後に、先頭と同様 #include で始まる行がありますが、これらは、 slapd に対してのみ設定されます。

その後、「capability」で、許可するケーパビリティを指定しています。

そして、各ファイルに対するアクセス許可が列挙されています。
最初にファイルのパスを、次に許可する内容を指定します。
パスに指定できる主な記述(グロブ文法)を、以下にさらりと示します。

  /some/where/*         /some/where/ 直下のファイル
  /some/where/**        /some/where/ 以下すべてのファイル
  /some/{where,else}    /some/where か /some/else

そして、許可する内容(モード)は、以下の組み合わせです。

  r   読み込み
  w   書き込み
  a   追記
  k   ファイルロック(flock)
  l   ハードリンク

つまり、そのプログラムが実行する可能性のある内容や、各ファイルへの操作を、 全部列挙してプロファイルに記述する必要があります。

 

ちなみに、ケーパビリティに関しては、以下で取り上げました。
よろしければご覧ください。(内容が古かったらごめんなさい。)

Vol.183 - ケーパビリティ で権限を少しだけ与える
http://www.usupi.org/sysad/183.html

AppArmor のモード

さて、AppArmor には、いくつかのモードがあります。
前回説明しましたが、念のためもう一度説明をしておきます。

プロファイルで許可された操作以外は許されない、 超厳格なモードのことを「強制モード(Enforce)」と言います。SELinux にもありますね。

それに対して、許されない操作はログに出力されるけど、 実際には操作が許されるモードを「不平モード/学習モード(Complain)」と言います。 SELinux の「Permissive」みたいな感じでしょうか。
(…って、前回もそう書いていました。)

今の状態を知るには、前回もご紹介しましたが、 「aa-status」もしくは「apparmor_status」コマンドを実行します。

  $ sudo apparmor_status
  apparmor module is loaded.
  31 profiles are loaded.
  30 profiles are in enforce mode.
  ...中略...
     /sbin/dhclient
     /usr/bin/evince
  ...後略...

プログラムを Enforce モードや Complain モードへ移行するには、 それぞれ「aa-enforce」や「aa-complain」コマンドを用います。
また、AppArmorを無効にするには、「aa-disable」コマンドを用います。
いずれも、対象のプログラムを引数に指定します。

たとえば以下では、/usr/sbin/mysqld を、AppArmorの支配から開放し、 自由な状態にしています。(セキュリティ上は好ましくない状態です。)

  $ sudo aa-disable /usr/sbin/mysqld

AppArmor を導入してみる

それでは、ようやく、なにかを AppArmor で守ってみましょう。
…その前に、ログへ出力して欲しいので、「auditd」パッケージを入れてください。 (ログに関しては、宿題の答えで述べます。)

  $ sudo apt-get install auditd

 

基本的な流れは、以下の通りです。

  1. 「aa-autodep」か「aa-genprof」でプロファイルを作る。
  2. 対象のプログラムを実行し、一通りの操作を行う。
  3. 「aa-logprof」で 2. の結果をプロファイルに反映する。
  4. Enforce モードにする。

それぞれの説明を、以降でやや詳しくしていきます。
なんとなく、「nginx」を例として取り上げてみました。

  1. プロファイルの作成
    aa-autodep を実行すると、ほぼ何も許可されていないプロファイルが作成され、 Complain モードに設定されます。
      $ sudo aa-autodep /usr/sbin/nginx
      Writing updated profile for /usr/sbin/nginx.
    
    aa-genprof を実行すると、こちらも同様にプロファイルを作成しますが、 以下のように、ログから情報を収集するか、コマンドを終了するか聞いてきます。
      $ sudo aa-genprof /usr/sbin/nginx
      ...
      Profiling: /usr/sbin/nginx
    
      [(S)can system log for AppArmor events] / (F)inish
    
    ここで F と答えると終了してしまうため、このまま放置します。
    F と答えても、自力で Complain モードにして、 aa-autodepを実行した場合と同じことをしていけば、同じゴールにたどり着けます。
      (上記で F と押した場合)
      Setting /usr/sbin/nginx to enforce mode.
      Reloaded AppArmor profiles in enforce mode.
      ...
      $ sudo aa-complain /usr/sbin/nginx
      Setting /usr/sbin/nginx to complain mode.
    
  2. 対象のプログラムを実行し、一通りの操作を行う。
    それがコマンドであれば、あらゆる可能性のある操作を、ひたすら実行しまくります。 それがすでに動作しているデーモンなどであれば、 サービスの再起動やいろんなアクセスを行います。
      $ sudo service nginx restart
    
    ここで許されていない操作は、全部ログに記録されています。
    (気になる貴兄は、/var/log/audit/audit.log を眺めましょう。)
  3. 収集した情報をプロファイルに反映する。
    aa-genprof の実行中であれば、S を押して次に進みます。
    aa-autodep でプロファイルを作成済であれば、「aa-logprof」を実行します。 以降はいずれも同等の作業となります。
      $ sudo aa-logprof
    
    引っかかった個々の操作に対して、許可するかどうか聞かれます。
    たとえば、以下では、 ファイルへのアクセスを許可するケーパビリティを追加するか聞かれています。
      Reading log entries from /var/log/audit/audit.log.
      Updating AppArmor profiles in /etc/apparmor.d.
      Complain-mode changes:
    
      Profile:    /usr/sbin/nginx
      Capability: dac_override
      Severity:   9
    
       [1 - #include ]
        2 - capability dac_override 
    
      [(A)llow] / (D)eny / Audi(t) / Abo(r)t / (F)inish
    
    追加する場合は a を、拒否するなら d を押します。
    ファイルやディレクトリへのアクセスに対しては、以下のように質問をされます。
      Profile:  /usr/sbin/nginx
      Path:     /etc/nginx/conf.d/
      Mode:     r
      Severity: unknown
    
       [1 - /etc/nginx/conf.d/]
    
      [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / \
      (F)inish / (O)pts
    
    一通り質問に答えると、最後に保存するかどうか聞かれますので、 保存するなら s を押します。
      The following local profiles were changed.  Would you like to save them?
    
       [1 - /usr/sbin/nginx]
        2 - /usr/sbin/postmap 
    
      (S)ave Changes / [(V)iew Changes] / Abo(r)t
    
    その後、中身を確認し、微調整が必要ならエディタを起動します。
    たとえば、/etc/nginx/ 以下はすべて読み込む可能性があるため、 複数のエントリをまとめて以下のようにしてしまうことができます。
      /etc/nginx/** r,
    
  4. Enforce モードにする。
    最後に、Enforce モードにして、しばらく様子を見ます。
      $ sudo aa-enforce /usr/sbin/nginx
    
    様子がおかしいときは、 ログ(/var/log/audit/audit.log)になにか出ていないか確認します。 出ている場合は、内容を確認してプロファイルに反映し、 再度 aa-enforce を実行します。

おわりに

以上、AppArmor をちょっと使ってみました。

基本的には、 ディストリビューションにもれなくついてくるプロファイルを使えばよいと思います。

ですが、なにか標準ではない状態で使う必要にかられたり、 新しいなにかを試すときなどの際に、ちょこっと手を加えたり、 まずはゆるく導入してみたり、といったことができるのではないかと思います。

AppArmor に関しては、openSUSE の以下のドキュメントに、 詳細の説明がどっちゃりあります。

OpenSUSE 12.2 : パート IV. AppArmor を利用した権利制限
http://opensuse-man-ja.berlios.de/opensuse-html/part.apparmor.html

宿題の答え

前回の宿題は、

  AppArmor で制限に引っかかったとき、どのログに出力されるのか想像
  (確認)してみましょう。

でした。

答えを言ってしまいますと、Auditlog(監査ログ)という仕組みを使って、 ログに吐いています。
このログをファイルに記録するには、 本題にも出てきましたが auditd というパッケージが必要になります。

Linuxカーネルは、Netlinkという機構を通して、ユーザにログを渡そうとします。 auditd は、Netlink からそのログを読み出し、ファイルに記録します。

ログファイルは「/var/log/audit/audit.log」です。
(厳密には /etc/audit/auditd.conf の log_file で指定されています。)
中身は、たとえばこんな感じです。

  type=LOGIN msg=audit(1338726601.174:1048): login pid=29523 uid=0 \
  old auid=4294967295 new auid=124 old ses=4294967295 new ses=882

audit の括弧内が時刻を表しますが、わかりにくいですね。
「ausearch」というコマンドを使うと、時刻を変換してくれます。

  $ sudo ausearch -m login
  ...
  time->Sun Jun  3 21:30:01 2012
  type=LOGIN msg=audit(1338726601.174:1048): login pid=29523 uid=0 \
  old auid=4294967295 new auid=124 old ses=4294967295 new ses=882

あるいは、perl などで変換してしまうのも一つの手です。

  $ sudo tail /var/log/audit/audit.log | \
  perl -pe 's/(\d+\.\d+)/localtime($1)/e'
  ...
  type=LOGIN msg=audit(Sun Jun  3 21:30:01 2012:1048): login \
  pid=29523 uid=0 old auid=4294967295 new auid=124 old ses=4294967295 \
  new ses=882

Auditlog に関しては、そのうち取り上げたいと思います。

今回の宿題

今回の宿題は、

  シンボリックリンクやハードリンクのファイルに対してAppArmorがどの
  ように動作するか、確認してみましょう。

です。

シンボリックリンクやハードリンクのリンク先がAppArmorの支配下にある場合、 どのような動作になるのか、確認してみましょう。

あとがき

今さらですが、Ubuntu 12.04 LTS(Long Term Support / 長期サポート版) が公開されましたので、アップグレードしました。
(某執筆が一段落するまで、じっと我慢していました。)

いつぞやに Ubuntu にしてから、ずっとアップグレードを繰り返しているからか、 シャットダウンや再起動してもしなかったり(電源ぶちっとしていました) などの問題をずっとかかえていました。

ですが、12.04 にアップグレードしてからは、再起動できるようになり、 細かいバグも見当たらなくなり、こころなしか動作も軽く(←たぶん毎回思っています) なったように感じ、いいことずくめな結果となりました。

ただ、ひとつ、大きな問題が発生しています。

最初のログイン画面で、わたしのアカウント名が列挙されないのです。
実は、以前から列挙されない現象は出ておりまして(いつぞやからなのかは失念しました)、 「その他」的な項目を選んで、アカウント名から入力することでしのいでいました。

今回、「その他」的な項目がなくなってしまい、 入れなくなってしまったという次第です。(実はこれも謎のひとつです。)

最初のログイン画面は、 「LightDM(Light Display Manager)」というひとが担当しておられます。 その設定やソースを見る限りでは、UIDが500以上だとか、 変なシェルを使っていないといったチェックに引っかかっているわけではないようでした。 (詳しくは、/etc/lightdm/ にある設定ファイルをご覧ください。)

そしてさらに不可解なのが、あれこれ調べたりしているうちに、 わたしのアカウント名がいつの間にか列挙されていることです。

そうして、なんとかグラフィカルにログインはできたものの、 微妙に釈然としないまま 12.04 を使い続けざるを得ない状態が続いています。

そのままでは気持ち悪いので、デバッグ文か何かを挿入したやつで試そうと思っています。 …が、もしなにかご存知の方がいらっしゃいましたら、 ご教示いただけますと超感謝感激です。

 

…というわけで、とくにオチもなにもない話でした。
あと、以下は宣伝です。

6/8(金)発売の、みんな大好き「日経Linux」7月号では、 某連載が最終回となっております。
また、最初の特集に変な絵が載っています。よろしければ立ち読みでご覧ください。 そしてもし気に入ったなら、買ってください。さらにもし時間がありましたら、 アンケートによかったとか書いてください。(^ε^)

最後の最後で、たっぷりの煩悩をお送りしました。(ごめんなさい)

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、6月17日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 今年もなにか栗活動を…計画します。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本