akarititle.png

Chapter 3: どうすれば AKARI をインストールできますか?

3.1. 依存するパッケージのインストール

カーネルモジュールおよびツールをコンパイルするためには以下のパッケージが必要になります。

これらのパッケージは以下のコマンドを実行することによりインストールできます:

RedHat 系の場合

# yum -y install wget gcc make ncurses-devel

Debian 系の場合

# apt-get -y install wget gcc make libncurses-dev

SUSE 系の場合

# yast -i wget gcc make ncurses-devel

3.2. カーネルモジュールのインストール

3.2.1. カーネルモジュール開発パッケージの入手

カーネルの開発用パッケージをインストールして、そのディレクトリに移動してください:

RedHat 系の場合

# VERSION=$(uname -r)
# yum -y install kernel-devel-${VERSION}
# cd /usr/src/kernels/${VERSION}*/

Debian 系の場合

# VERSION=$(uname -r)
# apt-get -y install linux-headers-${VERSION}
# cd /usr/src/linux-headers-${VERSION}/

SUSE 系の場合

# VERSION=$(uname -r)
# yast -i kernel-devel
# cd /lib/modules/${VERSION}/build/

3.2.2. AKARI カーネルモジュールのコンパイルとインストール

以下のコマンドを実行して AKARI カーネルモジュールのソースコードを展開してください:

# wget -O akari-1.0.44-20200922.tar.gz 'https://osdn.jp/frs/redir.php?f=/akari/49272/akari-1.0.44-20200922.tar.gz'
# wget -O akari-1.0.44-20200922.tar.gz.asc 'https://osdn.jp/frs/redir.php?f=/akari/49272/akari-1.0.44-20200922.tar.gz.asc'
# wget https://tomoyo.osdn.jp/kumaneko-key
# gpg --import kumaneko-key
# gpg akari-1.0.44-20200922.tar.gz.asc
# tar -zxf akari-1.0.44-20200922.tar.gz

systemd を利用している環境では、 /sbin/init ではなく /usr/lib/systemd/systemd が実行されます。 systemd を利用しているシステムの場合、以下のように akari/config.h の CONFIG_CCSECURITY_ACTIVATION_TRIGGER 行を編集してください:

変更前:

#define CONFIG_CCSECURITY_ACTIVATION_TRIGGER "/sbin/init"

変更後:

#define CONFIG_CCSECURITY_ACTIVATION_TRIGGER "/usr/lib/systemd/systemd"

もし、カーネルモジュールがロードされるのと同時に AKARI を有効化したい場合、以下のように akari/config.h の CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER 行を定義してください。(ただし、 CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER を定義する場合、 akari/policy/ ディレクトリにカーネルモジュール内に埋め込むためのポリシーを提供する必要があります。忘れた場合、カーネルモジュールがロードされるのと同時にカーネルパニックになります。):

変更前:

//#define CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER

変更後:

#define CONFIG_CCSECURITY_OMIT_USERSPACE_LOADER

以下のコマンドを実行して AKARI カーネルモジュールをインストールしてください:

# make SUBDIRS=$PWD/akari modules
# make SUBDIRS=$PWD/akari modules_install
# depmod ${VERSION}

もし、以下の何れかのエラーメッセージが表示された場合、ご利用のカーネルは AKARI に対応できませんのでご了承ください(代わりに TOMOYO Linux を利用してください)。その他のエラーメッセージが表示された場合は作者( penguin-kernel@I-love.SAKURA.ne.jp )にご連絡ください。

This module supports only 2.6.0 and later kernels.
You must choose CONFIG_SECURITY=y for building this module.
You must choose CONFIG_KALLSYMS=y for building this module.
You must choose CONFIG_PROC_FS=y for building this module.
You must choose CONFIG_MODULES=y for building this module.

もし、ご利用のカーネルでサポートされている機能や構文について知りたい場合には AKARI / TOMOYO 機能比較表 を参照してください。

3.2.3. AKARI カーネルモジュールをロードできるかどうかを確認(省略可)

AKARI モジュールを登録する処理は環境依存であるため、問題が起こる場合があります。そのため、問題なくロードできるかどうかを現時点で確認しておくことを推奨します。

以下のコマンドを実行して akari_test.ko モジュールをロードしてください:

# dmesg -c > /dev/null
# modprobe akari_test
# dmesg
akari_test: module verification failed: signature and/or required key missing - tainting kernel
security_ops=ffffffff81df6c80
find_task_by_vpid=ffffffff810821a0
find_task_by_pid_ns=ffffffff81082170
d_absolute_path=ffffffff811c8f10
All dependent symbols have been guessed.
Please verify these addresses using System.map for this kernel (e.g. /boot/System.map-`uname -r` ).
If these addresses are correct, you can try loading AKARI module on this kernel.

akari_test.ko のロードに成功した場合、上記のように推定されたシンボルのアドレスが表示されますので、実際の System.map ファイルの内容と比較して一致していることを確認してください。(表示されるシンボルの種類やアドレスは環境により異なります。):

# for i in ffffffff81df6c80 ffffffff810821a0 ffffffff81082170 ffffffff811c8f10; do grep $i /boot/System.map-${VERSION}; done
ffffffff81df6c80 b security_ops
ffffffff810821a0 T find_task_by_vpid
ffffffff81082170 T find_task_by_pid_ns
ffffffff811c8f10 T d_absolute_path

一致している場合には先へ進んでください。

カーネルコンフィグで CONFIG_RANDOMIZE_BASE=y という指定が行われている場合、 akari_test.ko が推定したアドレスと System.map ファイルに記録されている実際のアドレスとの間に(以下に示す例のように)差分が見つかることがあります。その場合、推定したアドレスは再起動する毎にランダムに変化しますが、差分の値が推定された各シンボルに対して同じであれば、先へ進んでください。それ以外の場合、このまま続行しても正常に動作しないので、作者にご連絡ください。

akari_test.ko のロードに失敗した場合、下記のようにエラーメッセージが表示されます。このまま続行しても正常に動作しないので、作者にご連絡ください:

# dmesg -c > /dev/null
# modprobe akari_test
FATAL: Error inserting akari_test (/lib/modules/2.6.32/extra/akari_test.ko): Invalid argument
# dmesg
Sorry, I couldn't guess dependent symbols.
I need some changes for supporting your environment.
Please contact the author.

もし、カーネルに /proc/sys/kernel/kptr_restrict という sysctl パラメータが存在し、値が 2 に設定されている場合、 akari_test.ko のロードは失敗します。その場合、ロードする前に 0 に変更し、ロードした後に 2 に戻すようにしてください。

# dmesg -c > /dev/null
# echo 0 > /proc/sys/kernel/kptr_restrict
# modprobe akari_test
# echo 2 > /proc/sys/kernel/kptr_restrict

3.3. 管理ツールのインストール

前述した依存するパッケージがインストールされていることを確認してください。以下のコマンドを実行することによりコンパイルおよびインストールできます。(必要に応じて、 USRLIBDIR=/usr/lib または USRLIBDIR=/usr/lib32 に変更してください。):

$ wget -O ccs-tools-1.8.7-20200505.tar.gz 'https://osdn.jp/frs/redir.php?f=/tomoyo/49693/ccs-tools-1.8.7-20200505.tar.gz'
$ wget -O ccs-tools-1.8.7-20200505.tar.gz.asc 'https://osdn.jp/frs/redir.php?f=/tomoyo/49693/ccs-tools-1.8.7-20200505.tar.gz.asc'
$ gpg ccs-tools-1.8.7-20200505.tar.gz.asc
$ tar -zxf ccs-tools-1.8.7-20200505.tar.gz
$ cd ccs-tools/
$ make -s USRLIBDIR=/usr/lib64
$ su
# make -s USRLIBDIR=/usr/lib64 install

3.4. 設定の初期化

管理ツールを実行するときに便利なように、管理ツールのインストールされているディレクトリ( /usr/sbin )を環境変数 PATH に追加したいと思うかもしれません。 bash を使用している場合、以下の行を ~/.bashrc に追加してください:

export PATH=$PATH:/usr/sbin

AKARI を使うためには、初期設定の手順を行う必要があります。この手順により、ポリシーを保存するディレクトリが作成されます。全てのポリシーファイルは /etc/ccs/ ディレクトリに保存されます。

初期設定を行うには2つのコマンドのどちらかを使用します。どの機能について解析および制限を行いたいかによりどちらのコマンドを使用するかが決まります。

ファイルの読み書きやプログラムの実行のようにファイルに関する機能だけを制限したいと思うユーザもいることでしょう。これは、ポリシーをシンプルにしたいユーザや AKARI が提供する全部の機能を必要とはしないユーザに適しています。ファイルに関する機能だけを制限する場合、このガイドで説明されている例えばネットワークに関する機能などの無関係な部分を無視することができます。ファイルに関する機能だけを使う場合、以下のコマンドを実行してください:

# /usr/lib64/ccs/init_policy --file-only-profile --module_name=akari

AKARI が提供する全部の機能を使ってファイルやネットワークや環境変数といった操作を解析したり制限したいと思うユーザもいることでしょう。これは、可能な限りシステムのセキュリティを高めたいと考えているユーザに適しています。このガイドでは全部の機能を使うことを想定して作成されています。全部の機能を使う場合、以下のコマンドを実行してください:

# /usr/lib64/ccs/init_policy --module_name=akari

上記のコマンドを実行することで、以下のような出力が表示される筈です:

# /usr/lib64/ccs/init_policy --module_name=akari
Creating policy directory... OK
Creating configuration directory... OK
Creating exception policy... OK
Creating domain policy... OK
Creating manager policy... OK
Creating default profile... OK
Creating stat policy... OK
Creating module loader... OK
Creating configuration file for ccs-editpolicy ... OK
Creating configuration file for ccs-auditd ... OK
Creating configuration file for ccs-patternize ... OK
Creating configuration file for ccs-notifyd ... OK

3.5. ブートローダの設定

カーネルに対するコマンドラインオプションで init= パラメータを指定することで正常に起動できなくなるシステム(例えば RHEL 7 )では、 initramfs 内で AKARI のカーネルモジュールをロードするように構成する必要があります。正常に起動できるシステム(例えば RHEL 6 )では、 init プロセス内で AKARI のカーネルモジュールをロードするように構成できます。

3.5.1. initramfs 内で AKARI のカーネルモジュールをロードする場合

dracut を利用しているシステムの場合、以下のように /etc/dracut.conf.d/akari.conf を作成の上、 initramfs を再構成してください:

# echo 'add_drivers+=" akari "' > /etc/dracut.conf.d/akari.conf
# dracut -f --kver ${VERSION}

ブートローダ( GRUB 等)の設定ファイルを編集し、 rd.driver.pre=akari というパラメータをカーネルに対するコマンドラインオプションに追加してください。以下に例を示します:

変更前:

linux16 /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=LABEL=/

変更後:

linux16 /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=LABEL=/ rd.driver.pre=akari

/boot/grub2/grub.cfg を直接編集するだけでも構いません。しかし、将来カーネルパッケージをアップデートする場合のために、以下のように /etc/default/grub の GRUB_CMDLINE_LINUX 行も編集しておくことを推奨します:

変更前:

GRUB_CMDLINE_LINUX="vconsole.keymap=jp106 crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet"

変更後:

GRUB_CMDLINE_LINUX="vconsole.keymap=jp106 crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet rd.driver.pre=akari"

3.5.2. init プロセス内で AKARI のカーネルモジュールをロードする

/sbin/akari-init を、以下のように作成してください。 ( modprobe が /sbin ではなく /bin にあるシステムの場合、 /bin/modprobe を指定してください。):

# echo '#! /bin/sh' > /sbin/akari-init
# echo '/sbin/modprobe akari && exec /sbin/init "$@"' >> /sbin/akari-init
# chmod 755 /sbin/akari-init

/sbin/init の代わりに /usr/lib/systemd/systemd を利用しているシステムの場合、以下のように /sbin/akari-init を作成してください:

# echo '#! /bin/sh' > /sbin/akari-init
# echo '/sbin/modprobe akari && exec /usr/lib/systemd/systemd "$@"' >> /sbin/akari-init
# chmod 755 /sbin/akari-init

ブートローダ( GRUB 等)の設定ファイルを編集し、 init=/sbin/akari-init というパラメータをカーネルに対するコマンドラインオプションに追加してください。以下に例を示します:

変更前:

kernel /boot/vmlinuz-2.6.32-754.9.1.el6.x86_64 ro root=LABEL=/

変更後:

kernel /boot/vmlinuz-2.6.32-754.9.1.el6.x86_64 ro root=LABEL=/ init=/sbin/akari-init

3.6. システムの再起動

ここまでで準備は完了です。(お疲れさまでした。)それでは、新しくインストールされたカーネルを使用してみましょう。システムを再起動し、 GRUB の画面(あるいは使用している他のブートローダの画面)で AKARI カーネルを選択してください。

/usr/lib/systemd/systemd または /sbin/init が開始される直前に以下のようなメッセージが表示される筈です。(表示される内容は環境により異なります。):

AKARI: 1.0.44   2020/08/20
Access Keeping And Regulating Instrument registered.
Calling /sbin/ccs-init to load policy. Please wait.
CCSecurity: 1.8.7+   2020/08/20
Mandatory Access Control activated.

quiet または rhgb オプションが指定されていると、カーネルメッセージの大部分が表示されなくなるため、 AKARI のメッセージが表示されなくなります。

カーネルコンパイル時の設定や起動時のオプションによっては、上記のメッセージが表示されないかもしれません。その場合、 /proc/ccs/ ディレクトリをチェックしてください。もし、 /proc/ccs/ ディレクトリが作成されていた場合、 AKARI モジュールは正常に登録されています。

AKARI はLSMモジュールですが、他のLSMモジュールと同時に利用することができます。しかし、 /etc/selinux/config に SELINUX=disabled という指定を行うことにより SELinux を無効にしている場合には、コマンドラインオプションに selinux=0 も追加する必要があります。これは、 /etc/selinux/config の中で SELINUX=disabled という指定が行われている場合、 AKARI が依存しているLSMフックを dracut が無効化してしまうためです。

3.7. どのようにすれば AKARI を無効化またはアンインストールできますか?

もし、このガイドに従って操作している間またはそれ以降にシステムが起動しなくなってしまった場合、ポリシーの設定が不適切である場合を含めて AKARI に原因があるかもしれません。その場合、 rd.driver.pre=akari または init=/sbin/akari-init というパラメータをカーネルに対するコマンドラインオプションから削除することにより、 AKARI が無効な状態でカーネルがロードされます。