Capability Moduleをモジュール化することで起こる様々な不具合


投稿日:2014年2月28日
  • 0
  • 0



Capability Moduleを有効にしたところBINDが起動しない不具合が発生

capability

前回の投稿」でカーネルを再構築してCapability Moduleを有効にしましたが、思わぬ不具合が出たのでメモとして残しておきます。

再起動は問題なくできたのですがBINDの起動の際に以下のエラーで起動ができないという現象に遭遇しました。


エラーの内容と対処法

起動時のエラーは以下のとおりです。

named を起動中: named: capset failed: Operation not permitted: please ensure that the capset kernel module is loaded.  see insmod(8)

環境は前回の投稿で書きましたが「64bitのCentOS 5.9でカーネルは2.6.18、Clam AntiVirus 9.7」という組み合わせです。

対処法を検索してみたところ、同様の報告が海外のフォーラムで盛んに議論されていました。
いくつか紹介します。

libcapによるバグという報告

http://fixunix.com/kernel/384216-re-2-6-25-kernel-problems-capabilities.html
テストとしてlibcapの1.10 、1.92、1.97のバージョンをインストールしてみましたが改善しませんでした。

その他の報告

  • ハードウエアアクセラレータによるバグという報告
  • SELinuxとの依存関係によるバグという報告
  • commoncap.koとの読み込み順序による不具合という報告
  • 公式のvanillaカーネルからコンパイルをすると動作するとの報告
  • 64bit特有のバグという報告

これらの情報を元に対策を取りましたが、カーネルのコンパイル時に失敗するか、BINDの不具合が出て先に進みません。

実は前回の投稿をする前に「32bitのCentOS5.8でカーネルが2.6.17」という環境でCapability Moduleを有効にするテストしていたのですが、その環境では問題なくCapability ModuleBINDも動作しています。

カーネルコンパイル時のエラー

SELinuxと競合しているということでNSA SELinux Supportを全て無効にし、Default Linux CapabilitiesをMとしてコンパイルした際のエラー。

security/built-in.o: In function `security_ops_task_setrlimit':
/home/www/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64/security/security.c:47: undefined reference to `selinux_ops'
/home/www/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18-371.4.1.el5.x86_64/security/security.c:48: undefined reference to `selinux_task_setrlimit'
make: *** [.tmp_vmlinux1] エラー 1

コンパイルに成功しても「make modules_install」とした際に以下のエラーで止まることもありました。

WARNING: /lib/modules/2.6.18-371.4.1.el5xen/kernel/security/commoncap.ko needs unknown symbol dac_mmap_min_addr
WARNING: /lib/modules/2.6.18-371.4.1.el5xen/kernel/security/commoncap.ko needs unknown symbol dmesg_restrict

CONFIG_SECURITY_DMESG_RESTRICTCONFIG_LSM_MMAP_MIN_ADDRと競合しているという情報もありましたが、こちらを無効にしても同じようにエラーが出ました。

ちなみにdazukoのコンパイル時のオプションに、他のローダブルセキュリティーモジュールとの競合を回避するというものがあります。

試しに以下のオプションでコンパイルをしたところ正常に終了しました。

# ./configure --enable-syscalls --mapfile=/boot/System.map-2.6.18-371.4.1.el5xen --disable-stacking

しかし、いざテストやインストールしたモジュールを取り込もうとするとシステムがシャットダウンするというバグが発生。恐らく、他のセキュリティーモジュールによって競合しているものと思われます。

もしもカーネルパニックが起こる場合は「--sct-readonly」というオプションを付けると改善するとありましたが、これも効果なしでした。

他にもDebianで使われるgrsecとも相性が悪く競合するとのことです。

ここで再考

Capability Moduleはカーネル2.6.25以前と、2.6.25以降で大きく機能が異なります。
さらに、2.6.38以降ではfanotifyという機能に取って代わられています。
どのみち限定的な環境でしか有効にできないのなら「とりあえず動作すれば良い」ということで、再びコンパイル作業を行い、モジュール化せずにカーネルに取り込むことにしました。(つまりデフォルトの設定に戻した)

以下、make menuconfigの際の、Security optionsです。

#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_CAPABILITIES=y
# CONFIG_SECURITY_ROOTPLUG is not set
# CONFIG_SECURITY_SECLVL is not set
CONFIG_LSM_MMAP_MIN_ADDR=4096
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT=y
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set

あたりまえですが、この設定ならCapability ModuleBINDも正常に動作しています。


失敗した例ばかりで恐縮ですが、同じ悩みを持つ人の助けになればと思って公開します。
やはりファイルアクセスを制御するセキュリティモジュールという特性上、他のシステムと干渉しやすく、影響も大きいためできれば公式でサポートされた機能を利用するのが安心ですね。

その後、vanilla kernelで動作テストしたところ、問題なく動きました。
よく見たらDazukoのDownloadsにある「Target」にCentOSは無いので、そもそもサポートしていないのかもしれません。


現在のページを共有する



現在のページに関連する記事

Capability Moduleをモジュール化することで起こる様々な不具合 CentOSでカーネルの再構築を行いカーネルモジュールを有効にする方法
Capability Moduleをモジュール化することで起こる様々な不具合 Clam AntiVirusのClamukoでウイルスのリアルタイムスキャンを有効にする方法
Capability Moduleをモジュール化することで起こる様々な不具合 yum-utilsを使って/bootの不要なカーネルを削除する方法
Capability Moduleをモジュール化することで起こる様々な不具合 Linuxの各アプリケーションが共通して利用する「PAM認証」について
Capability Moduleをモジュール化することで起こる様々な不具合 Linuxの基本の基本。Linuxの基本的なディレクトリ構成
Capability Moduleをモジュール化することで起こる様々な不具合 「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法
Capability Moduleをモジュール化することで起こる様々な不具合 Nginx 1.6.2にngx_cache_purge 2.3組み込むんでコンパイルする方法

おすすめの記事

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する方法

Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する…

Web Fontの使い方とGoogle Fontsのオススメフォント 10選

Web Fontの使い方とGoogle Fontsのオススメフォント 10選

サーバで管理していたWordPressをローカル環境に移行する方法

サーバで管理していたWordPressをローカル環境に移行する方法

シンプルなスパムコメント対策プラグイン「Simple AntiSpam」を作成しました

シンプルなスパムコメント対策プラグイン「Simple AntiSpam」を…

Excelでセルとセルの間をダブルクリックすると移動する機能を停止する方法

Excelでセルとセルの間をダブルクリックすると移動する機能を停…

Linuxでサーバを構築するに当たって必要になる基礎知識

Linuxでサーバを構築するに当たって必要になる基礎知識

プロ根性のあるデザイナーやブロガーにお勧めする4つの画像編集ソフト

プロ根性のあるデザイナーやブロガーにお勧めする4つの画像編集…


コメントを残す

コメントは認証制のため、すぐには反映されません。

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。