ウェブサイト検索

LinuxでACL(アクセス制御リスト)を使用してファイル/ディレクトリを保護する


システム管理者として、私たちの最優先事項は、不正アクセスからデータを保護し、セキュリティを確保することです。私たちは皆、chmod、chown、chgrpなどの便利なLinuxコマンドを使用して設定される権限について意識しています。しかし、これらのデフォルトの権限セットにはいくつかの制限があり、時には私たちのニーズに応じて機能しないことがあります。たとえば、同じディレクトリやファイルに対して異なるユーザーのために異なる権限セットを設定することはできません。したがって、アクセス制御リスト(ACL)が実装されました。

例えば、あなたが3人のユーザー「tecmint1」「tecmint2」「tecmint3」を持っているとしましょう。それぞれに共通のグループ「acl」があります。ユーザー「tecmint1」は、ユーザー「tecmint2」だけが「tecmint1」が所有するファイルを「読み取る」ことができ、他の誰もそのファイルにアクセスできないようにしたいと考えています。

ACL(アクセス制御リスト)は私たちが同じトリックを行うことを可能にします。これらのACLは、ユーザー、グループ、およびユーザーのグループリストに含まれていない任意のユーザーグループに対して権限を付与することを許可します。

注意: Redhat製品のドキュメントによると、ext3ファイルシステムとNFSエクスポートされたファイルシステムに対してACLサポートを提供しています。

LinuxシステムでACLサポートを確認する方法

前に進む前に、現在のカーネルとマウントされたファイルシステムでACLのサポートが必要です。

1. ACLサポートのためにカーネルをチェックする

ファイルシステムのACLサポートとPOSIX_ACL=Yオプションを確認するには、次のコマンドを実行してください(Yの代わりにNがある場合は、カーネルがACLをサポートしていないことを意味し、再コンパイルする必要があります)。

[root@linux ~]# grep -i acl /boot/config*

CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

2. 必要なパッケージを確認する

ACLを使い始める前に、必要なパッケージがインストールされていることを確認してください。以下は、yumまたはapt-getを使用してインストールする必要があるパッケージです。

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@linux ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

3. マウントされたファイルシステムのACLサポートを確認する

さて、マウントされたファイルシステムがACLオプションでマウントされているかどうかを確認してください。同様のことを確認するために、以下に示すように‘mount’コマンドを使用できます。

[root@linux ~]# mount  | grep -i root

/dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)

しかし、私たちのケースでは、デフォルトでaclが表示されていません。次に、aclオプションを使ってマウントされたパーティションを再マウントするオプションがあります。しかし、その前に、パーティションがaclオプションでマウントされているかどうかを確認するための別のオプションがあります。最近のシステムでは、デフォルトのマウントオプションに統合されている場合があります。

[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

上記の出力では、デフォルトのマウントオプションがすでにACLをサポートしていることがわかります。別のオプションは、以下のようにパーティションを再マウントすることです。

[root@linux ~]# mount -o remount,acl /

次に、永続的にするために「/etc/fstab」ファイルに以下のエントリを追加してください。

/dev/mapper/fedora-root /	ext4    defaults,acl 1 1

再び区画を再マウントしてください。

[root@linux ~]# mount -o remount  /

4. NFSサーバー用

NFSサーバーにおいて、NFSサーバーによってエクスポートされたファイルシステムがACLをサポートしており、ACLがNFSクライアントによって読み取ることができる場合、ACLはクライアントシステムによって利用されます。

NFS共有におけるACLの無効化のためには、NFSサーバーの「/etc/exportfs」ファイルに「no_acl」オプションを追加する必要があります。NFSクライアント側で再度無効化するには、マウント時に「no_acl」オプションを使用してください。

LinuxシステムにACLサポートを実装する方法

ACLには2種類あります。

  1. アクセスACL: アクセスACLは、ファイルやディレクトリへの権限を付与するために使用されます。
  2. デフォルトACL: デフォルトACLは、特定のディレクトリに対してアクセス制御リストを付与/設定するために使用されます。

アクセスACLとデフォルトACLの違い:

  1. デフォルトACLはディレクトリレベルでのみ使用できます。
  2. そのディレクトリ内で作成された任意のサブディレクトリまたはファイルは、親ディレクトリからACLを継承します。一方、ファイルはデフォルトのACLをアクセスACLとして継承します。
  3. デフォルトACLを設定するために「–d」を使用し、デフォルトACLはオプションです。
デフォルトACLを設定する前に

特定のファイルやディレクトリのデフォルトACLを決定するには、'getfacl'コマンドを使用します。以下の例では、getfaclを使用してフォルダー'Music'のデフォルトACLを取得します。

[root@linux ~]# getfacl Music/

file: Music/
owner: root
group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::rw-
デフォルトACLを設定した後

特定のファイルやディレクトリのデフォルトのACLを設定するには、「setfacl」コマンドを使用します。以下の例では、「setfacl」コマンドがフォルダ「Music」に新しいACL(読み取りと実行)を設定します。

[root@linux ~]# setfacl -m d:o:rx Music/
[root@linux ~]# getfacl Music/
file: Music/
owner: root
group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::r-x

新しいACLを設定する方法

ファイルまたはディレクトリの設定や変更にはsetfaclコマンドを使用します。例えば、ユーザーtecmint1に読み取りおよび書き込み権限を与えるには。

# setfacl -m u:tecmint1:rw /tecmint1/example

ACLを表示する方法

任意のファイルやディレクトリのACLを表示するには、‘getfacl’コマンドを使用します。たとえば、‘/tecmint1/example’のACLを表示するには、以下のコマンドを使用します。

# getfacl /tecmint1/example

file: tecmint1/example/
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

ACLを削除する方法

ファイルやディレクトリからACLを削除するには、以下に示すようにxおよびbオプションを使用します。

# setfacl -x ACL file/directory  	# remove only specified ACL from file/directory.

setfacl -b  file/directory   		#removing all ACL from file/direcoty

次のシナリオにACLを実装しましょう。

2人のユーザー(tecmint1とtecmint2)は、共通のセカンダリーグループ「acl」に属しています。私たちは「tecmint1」が所有するディレクトリを1つ作成し、そのディレクトリに対してユーザー「tecmint2」に読み取りおよび実行の権限を付与します。

ステップ1: 2人のユーザーを作成し、両方のパスワードを削除します。

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

ステップ2: グループを作成し、ユーザーをセカンダリグループに追加します。

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

ステップ 3: ディレクトリ /tecmint を作成し、所有権を tecmint1 に変更します。

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
file: tecmint1
owner: tecmint1
group: root
user::rwx
group::r-x
other::r-x

ステップ4: tecmint1でログインし、/tecmintフォルダーにディレクトリを作成します。

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

ステップ 5: 次に、ACL を設定するために ‘setfacl‘ を使用します。‘tecmint1‘ にはすべての rwx 権限を、‘tecmint2‘ には ‘example‘ フォルダーに対してのみ 読み取り 権限を与え、他のユーザーには権限を与えないようにします。

$ setfacl -m u:tecmint1:rwx example/
setfacl -m u:tecmint2:r-- example/
setfacl -m  other:--- example/
getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

ステップ6:次に、別の端末で別のユーザー、すなわちtecmint2でログインし、ディレクトリを/tecmint1に移動します。次に、lsコマンドを使用して内容を表示し、その後ディレクトリを変更して、下のように違いを確認してください。

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

ステップ 7: 現在、‘tecmint2‘ に ‘example‘ フォルダーへの ‘execute‘ 権限を付与してください。次に、‘cd‘ コマンドを使用してその効果を確認してください。今、‘tecmint2‘ はディレクトリを表示して変更する権限を持っていますが、何かを書く権限はありません。

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

注意: ACLを実装した後、‘ls -l’の出力に以下のように追加の‘+‘記号が表示されます。

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

参照リンク

ACLのドキュメント

関連記事: