第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記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間