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

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

こんばんは、うすだです。

世間では、4/28 から 5/6 まで、9日もの間、黄金週間とやらだったようですね。 存分にお休みを楽しんでこられましたでしょうか。

わたしの所属する会社も、世間と同じ休日だったのですが、わたしの場合は、 逼迫なお仕事がございましたので、前半はその対応を行ってました。

中盤は、その後処理的なことや、別件での対応…。

そして後半は、某雑誌の原稿と当メルマガ…。

…もちろん、合間にいろいろ余計なことをして、 それなりには休暇を満喫したとは思います。ですが、なんといいますか、こう、 骨の芯まで休んだ日がなかったのです。休んだという気がしないんです!

このままでは悔しいので、黄金週間が終わってから、 休日出勤分の代休をどーんと取得して、骨の髄まで休みたいと思います。

…そんな夢を見ながら、今回もはりきってまいりましょう!

今回のお題 - AppArmor をおおまかに理解する

UNIX系のシステムでは、レガシーなパーミッション(ユーザ、グループとその他) でいろいろ管理を行ってきました。

ですが、root の権限は絶対的で、 パーミッションを超越してなんにでもアクセスできてしまいます。また、 ある部分だけ権限を与えるだけのために root で動かしたくない、 言い換えると root じゃないひとに少しだけ権限を与えたい、 というニーズも増えてきたりしています。

それらを実現するため、「SELinux」や「TOMOYO Linux」などという技術が開発され、 セキュリティに関してより強固で柔軟な設定が行えるようになってきました。

で、その中に、Novell社(厳密にはNovellが買収した旧Immunix社)が開発した 「AppArmor」というセキュリティ技術があります。

FedoraなどRedHat系のディストリビューションでは SELinux が標準採用されていますが、 SELinux はなにかと複雑であり、玄人さんでないと設定が難しいという印象を受けます。

それに対して、SUSEや、Debian系のディストリビューションで採用されている AppArmor は、それほど複雑でなく、 かつ様々な制約を設けたりすることができるようになっています。

というわけで今回は、awkの応用例が特に思い浮かばなかった (正確には、考える時間がなかった)ため、awkのことはなかったことにして、 AppArmor のさわりをご紹介したいと思います。

RedHat系のディストリビューションをお使いの貴兄は、 まあこんな機構もあるんだなあなどと思いながら、読んでいただけますと幸いです。

AppArmor とは?

AppArmor とは、プログラム単位でMAC(Mandatory Access Control - 強制アクセス制御) を行うためのセキュリティ機構です。

MACとは、従来のファイルのパーミッションの設定等とは関係なく、 強制的にアクセス制限を設けることができる機構です。

AppArmor では、プログラム毎に、 ファイルやソケットなどに対して行うことのできる操作を明示的に指定し、 それ以外の操作を行えなくすることができます。これにより、 セキュアな環境の構築が可能となります。

SELinux などと大きく異なるところは、 設定したプログラムに対して制限が有効になりますが、 設定していないプログラムに対しては従来通り制限のない状態で動作する、という点です。

ですので、すべての設定が必要になる…ということはなく、 制限をつけることのできるプログラムから順次設定していき、対象の輪を広げていく、 という導入が可能となります。
SELinux などでは、えいやーで全部対象にする必要がありますので、それと比べると、 導入は比較的簡単ではないかと思います。

ただ、そのあたりは、 セキュリティに対する考え方によって利点とも欠点ともとれますので、 どちらがよいというわけではありません。

AppArmor は、Linux カーネル側で MAC の機能を行うためのセキュリティモジュールと、 その設定を行うためのツール群に分けられます。
以降では、それぞれの役割について、簡単に説明していきます。

Linuxカーネル側の処理

AppArmorのセキュリティモジュールは、 LSM(Linux Security Modules)というカーネルの機能を利用しています。

LSM とは、Linuxカーネルのセキュリティ・フレームワークです。
Linux には、今回取り上げる AppArmor だけでなく、 先ほど名前を挙げた「SELinux」や「TOMOYO Linux」や、 他にも「SMACK」などのセキュリティモジュールがあります。
これらはみな LSM を介して機能を実現していますので、 いずれかを選択して利用することができます。ただし、 ローダブルなモジュールではないため、動的に変更することはできません。

で、LSMですが、具体的には、 open や socket などの各システムコールでLSMのチェック関数を呼び、 それらの操作を許可するかどうか、 それぞれのセキュリティモジュールに判断させています。

たとえば、ネットワークソケットを生成するためのsocketシステムコールでは、 LSMの関数「security_socket_create」を呼び出し、判断していることがわかります。

  __sock_create() in net/socket.c
      ...中略...
      err = security_socket_create(family, type, protocol, kern);
      if (err)
          return err;  /* エラーならエラーを返して終わり */
      ...後略...

security_socket_create() では、各モジュールのsocket_createに丸投げしています。

  security_socket_create() in security/security.c
      /* 各モジュールの socket_create に丸投げ */
      return security_ops->socket_create(family, type, protocol, kern);

AppArmor の場合、「apparmor_socket_create」がその実体です。

  apparmor_socket_create() in security/apparmor/lsm.c
      int error = 0;
      ...中略...
      /* プロセス(プログラム)のプロファイルを入手する */
      profile = __aa_current_profile();
      /* 制限がかけられていたらチェックする */
      if (!unconfined(profile))
          error = aa_net_perm(OP_CREATE, profile, family, type,
                              protocol, NULL);
      return error;

AppArmor では、プログラム毎に設けた制限を「プロファイル」と呼び、 その中で許可された処理だけを行うことができます。
上記では、プロファイルを入手し、 その中でソケットの生成が許可されているかどうかを(aa_net_permで) チェックしています。

ツール側の処理

Linuxカーネル側では、前述のような感じで制限を加えています。
ただ、その判断のもとになるプロファイルの内容は、ユーザ側で生成し、 登録する必要があります。

まず、AppArmor には2つのモード「complain」「enforce」があります。 complainは、チェックはするけど実際には制限しないモード (SELinux のpermissiveと同じでしょうか)です。enforceは、 実際に制限も行うモードです。

いまどうなっているのかは、 「aa-status」もしくは「apparmor_status」コマンドで確認できます。 (後者は前者のシンボリックリンクです。)

  $ sudo /usr/sbin/aa-status
  apparmor module is loaded.
  12 profiles are loaded.
  12 profiles are in enforce mode.
  ...中略...
     /sbin/dhclient
     /usr/bin/evince
     /usr/bin/evince-previewer
     /usr/bin/evince-thumbnailer
  ...中略...
  0 profiles are in complain mode.
  3 processes have profiles defined.
  3 processes are in enforce mode.
     /sbin/dhclient (9760) 
     /usr/lib/telepathy/mission-control-5 (5049) 
     /usr/sbin/cupsd (753) 
  ...後略...

各プログラム毎にモードを設定できますが、 基本的にはみな enforce になっていると思います。 12のプロファイルがenforceモードに設定され、 3つのプロセスがenforceモードで動作していることがわかります。

そして、実際にどういう設定になっているかというと、 /etc/apparmor.d/ 以下に設定ファイル(プロファイル)があります。

  $ ls -F /etc/apparmor.d/
  abstractions/          local/           usr.lib.telepathy
  cache/                 sbin.dhclient    usr.sbin.cupsd
  disable/               tunables/        usr.sbin.tcpdump
  force-complain/        usr.bin.evince
  lightdm-guest-session  usr.bin.firefox

…が、詳細につきましては、次回に説明したいと思います…。

おわりに

以上、実践と言いながら、AppArmorの説明だけで終わってしまいました。

その分、中身について、いつもより詳しく説明しました。
…というのも、自分がよくわかっていなかったからです。(^ε^;;

というわけで次回は、ちゃんと実践的な内容でお送りしたいと思います。

宿題の答え

前回の宿題は、

  du -sk * の結果のうち、1MB以上のものだけを出力しましょう。

でした。

フツーに、du -sk * と実行すると、 各ファイルやディレクトリの容量がkB単位で出力されます。

  $ du -sk *
  16    accountsservice
  16    acl
  16    acpi-support
  ...

このうち、左側の最初のフィールドの数値が 1MB 以上 …すなわち 1024kB以上の結果だけを出力すればよいと思います。
というわけで、さらっと書いたのがこちらです。

#!/usr/bin/awk -f
{
  if ($1 >= 1024) {
      print $0;
  }
}

入力行すべてに対して、最初のフィールドの数値が 1024 以上なら、 その行をすべて出力する、ということを行っています。

これを、たとえば parse1mb.awk などというファイル名にした場合、 以下のように実行権をつけて実行します。

  $ chmod +x parse1mb.awk
  $ du -sk * | ./parse1mb.awk
  1168  /usr/share/doc/bind9-doc
  1124  /usr/share/doc/chromium-browser
  1116  /usr/share/doc/chromium-browser-l10n
  ...

ただ、これだと、最初のフィールドが数値でない場合に、判定を誤る可能性があります。 そのため、数値からなることを確認します。

#!/usr/bin/awk -f
/^[[:digit:]]+[[:space:]]+/ {
    if ($1 >= 1024) {
	print $0;
    }
}

ただ、これだと、そうでない行が出力されません。
もし、そうでない行を出力したい場合は、以下のようにします。

#!/usr/bin/awk -f
/^[[:digit:]]+[[:space:]]+/ {
    if ($1 >= 1024) {
	print $0;
    }
}
! /^[[:digit:]]+[[:space:]]+/ {
    print $0;
}

どんどんシンプルでなくなってしまいましたが…。
もっとさらっと書ける方がいらっしゃいましたら、ご教示ください。

今回の宿題

今回の宿題は、

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

です。

これといった実践を行わなかったので、宿題も微妙ですが…。
どこに吐かれているのかは、知っておいた方がよいということで、 確認か想像をしておいてくださいませ。

あとがき

半分SEになって、1年以上が過ぎました。

プログラム開発もあるにはありますが、 ひとに書いてもらってチェックをするだけのケースが増え、 自分でプログラムを書く機会は、ぐーんと減りました。

ですが、今よりも上を目指したい、新しい言語にも手をつけたい、 という気持ちは衰えていません。
ですので、いまどんな言語が注目されているのか、というのは、 常に気になっております。

で、最近の傾向は、以下のようになっているようです。

TIOBE Software: Tiobe Index
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

C と Java が君臨し、 その後を C++, Objective-C, C# が追うという展開が続いています。
ここ最近では、Objective-C の増加が目覚ましく、 PHP がやや衰えを見せはじめている(かもしれない)といったところでしょうか。

上記で公開されているグラフを見る限りでは、注目度が上昇中の言語は、 C# か Objective-C のようで、これらを学ぶとよさそうです。

個人的に興味のあった Scala は…45位でした。
何の因果か、真上の44位には Awk さんがいらっしゃいました。(^ε^)

50位まで、じつに様々な言語が並んでおり、眺めているだけでも興味深いです。 興味のある貴兄は、是非ご覧くださいませ。

 

…で、どの言語に手をつければいいんですかね…悩みは解決してません。

 

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

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本