第2回 ファイルACLを用いたアクセス制御
面 和毅サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
シニアマネージャ
2005/12/7
LIDSの内部構造に迫る
では、実際にLIDSではどのようにしてファイルACLに対しての強制アクセス制御を実現しているのでしょうか? 内部構造を簡単に見ていきましょう。
LIDSでは、ファイルやディレクトリに関しての情報をinodeとデバイス番号により管理しています。inodeとデバイス番号からアクセスが行われた際にアクセス権を抽出し、実際にアクセスの許可/拒否を決定しています。
LIDSには、inodeやデバイス番号、アクセス権などの情報が入るテーブルが用意されています。ACLを追加するとこのテーブル内にinodeやアクセス権などが登録されていきます。各システムコールにおいて、このテーブルが参照され動作の許可/拒否が決定されます。
このテーブルの実態は、LIDS-1系列では「lids_sys_acl」という構造体と「lids_acl」という構造体の組み合わせによって定義されています。
struct lids_sys_acl { unsigned long int ino; /* the subject node number */ unsigned long flags; /* capability flags */ struct lids_cap cap[32]; /* inheritable array */ int socket; /* socket */ int mark; #ifdef CONFIG_LIDS_TDE int sandbox; /* sandbox flag */ #endif int port[LIDS_PORT_ITEM][2]; /* ports for CAP_NET_BIND_SERVICE */ int cport[LIDS_PORT_ITEM][2]; /* ports for CAP_NET_BROADCAST */ struct lids_acl *lids_acl; /* object acl */ kdev_t dev; /* the subject dev number */ }; struct lids_acl { struct lids_acl *next; unsigned long int ino; kdev_t dev; int type; /* READ WRITE APPEND DENY */ int inherit; /* inheritance level */ time_t time[LIDS_TIME_ITEM][2]; /* time restriction */ }; |
LIDS-2系列では「lids_subject_acl」という構造体と「lids_object_acl」という構造体の組み合わせによって定義されています。
struct lids_object_acl { __u32 sid; /* subject id*/ __u32 oid; /* object id*/ struct lids_s_inode inode; /* point the the original inode */ __u32 type; /* READ WRITE APPEND DENY */ __u32 inherit; /* the inherit level */ struct lids_object_acl *next; #ifdef __KERNEL__ char name[64]; /* filename of the inode */ #else char name[PATH_MAX]; /* filename of the inode */ #endif } __attribute__ ((__packed__)) ; struct lids_subject_acl { __u32 sid; /* sid */ __u32 ext_cap; /* socket */ __u32 sys_cap; /* Move from tsk */ __u32 o_acl_num; /* the object number */ __u32 port[16][2]; /* bind port */ struct lids_cap cap_inherit[32]; /* inheritable array */ struct lids_object_acl *o_acl; /* object acl */ } __attribute__ ((__packed__)) ; |
LIDS-1系列でのファイルアクセス制御
LIDS-1系列では、ファイルへのアクセスを制御するために、linux/fs以下にある、
- open.c
- namei.c
- readdir.c
- read_write.c
などのファイル関連のシステムコールが定義されているソースに対してパッチを当てています。
例えば、mkdirを行うシステムコールである「sys_mkdir」中には、lids_check_base関数によってLIDSでのアクセス権がチェックされた後に、vfs_mkdir関数が呼ばれ、その中で通常のアクセス権がチェックされることになります。
asmlinkage long sys_mkdir(const char * pathname, int mode) { int error = 0; char * tmp; --略-- error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; dentry = lookup_create(&nd, 1); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { #ifdef CONFIG_LIDS error = 0; /* FIXME, do we need this? */ if (lids_load && lids_local_load&& lids_check_base(dentry, LIDS_WRITE)) { --略-- } if (!error) #endif error = vfs_mkdir(nd.dentry->d_inode, dentry, mode & ~current->fs->umask); |
LIDS-2系列でのファイルアクセス制御
LIDS-2系列では、Linuxカーネル2.6から標準で付いてくる「LSM」という機構を使っています。LSMはカーネル内のセキュリティチェック機構へのフック関数群を定義するフレームワークです。
【参考記事】 全貌を現したLinuxカーネル2.6[第4章] http://www.atmarkit.co.jp/flinux/special/kernel26/kernel26_04b.html |
カーネル2.6における「sys_mkdir」中には、やはりvfs_mkdir関数を呼び出しますが、vfs_mkdirのソースが次のように変わっています。
int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) { int error = may_create(dir, dentry, NULL); ――(1) if (error) return error; if (!dir->i_op || !dir->i_op->mkdir) return -EPERM; mode &= (S_IRWXUGO|S_ISVTX); error = security_inode_mkdir(dir, dentry, mode); ――(2) if (error) return error; |
まず、(1)の部分、
int error = may_create(dir, dentry, NULL); |
により通常のLinuxでのアクセス制御がチェックされます。その後、(2)の部分、
error = security_inode_mkdir(dir, dentry, mode); |
によってsecurity_inode_mkdir関数が呼ばれています。これが最終的にLIDSの関数を呼び出し、LIDSでのアクセス権がチェックされることになります。
カーネル2.6では、ほとんどのシステムコールに対してLSMを利用したこのようなセキュリティチェックが行われるようになったため、より簡単/確実にセキュリティを高めることができるようになりました。
◆ ◇ ◆
次回は、LIDSの特徴の2つ目である「Linuxケーパビリティ」を見ていきます。
3/3
|
Index | |
ファイルACLを用いたアクセス制御 | |
Page1 LIDSのコンセプトと特徴 LIDSのアクセス制御方法 |
|
Page2 LIDSの特徴、それは直感的な設定 ACL(Access Control List) ファイルに対するアクセス制御のフロー |
|
Page3 LIDSの内部構造に迫る LIDS-1系列でのファイルアクセス制御 LIDS-2系列でのファイルアクセス制御 |
Profile |
面 和毅(おも かずき) サイオステクノロジー株式会社 インフラストラクチャービジネスユニット Linuxテクノロジー部 OSSテクノロジーグループ シニアマネージャ 学生時代よりUNIXに親しむ。1997年からサーバ構築およびセキュリティ全般を扱う仕事に従事、Linuxを使い始める。 現在はLIDSの普及活動に注力。LIDSユーザ会(LIDS-JP)の立ち上げやLIDS関連文書の日本語化、LIDSを用いたシステム構築の紹介などを行っている。また、サイオステクノロジーでビジネス面でのLIDSの普及活動に注力している。 |
Security&Trust記事一覧 |
- Windows起動前後にデバイスを守る工夫、ルートキットを防ぐ (2017/7/24)
Windows 10が備える多彩なセキュリティ対策機能を丸ごと理解するには、5つのスタックに分けて順に押さえていくことが早道だ。連載第1回は、Windows起動前の「デバイスの保護」とHyper-Vを用いたセキュリティ構成について紹介する。 - WannaCryがホンダやマクドにも。中学3年生が作ったランサムウェアの正体も話題に (2017/7/11)
2017年6月のセキュリティクラスタでは、「WannaCry」の残り火にやられたホンダや亜種に感染したマクドナルドに注目が集まった他、ランサムウェアを作成して配布した中学3年生、ランサムウェアに降伏してしまった韓国のホスティング企業など、5月に引き続きランサムウェアの話題が席巻していました。 - Recruit-CSIRTがマルウェアの「培養」用に内製した動的解析環境、その目的と工夫とは (2017/7/10)
代表的なマルウェア解析方法を紹介し、自社のみに影響があるマルウェアを「培養」するために構築した動的解析環境について解説する - 侵入されることを前提に考える――内部対策はログ管理から (2017/7/5)
人員リソースや予算の限られた中堅・中小企業にとって、大企業で導入されがちな、過剰に高機能で管理負荷の高いセキュリティ対策を施すのは現実的ではない。本連載では、中堅・中小企業が目指すべきセキュリティ対策の“現実解“を、特に標的型攻撃(APT:Advanced Persistent Threat)対策の観点から考える。
|
|