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

システム管理者として、最優先事項は未承認アクセスからデータを保護し、セキュリティを確保することです。私たちは、chmodchownchgrpなどの便利なLinuxコマンドを使用して設定するアクセス権について認識しています。ただし、これらのデフォルトのパーミッションセットには制限があり、時には私たちのニーズに合わないことがあります。例えば、同じディレクトリやファイルに対して異なるユーザーごとに異なるパーミッションセットを設定することはできません。そのため、アクセス制御リストACLs)が実装されました。

Linux Access Control Lists

例えば、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サーバーの「no_acl」オプションを「/etc/exportfs」ファイルに追加する必要があります。NSFクライアント側で再度無効にするには、マウント時に「no_acl」オプションを使用します。

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

ACLには2種類のACLがあります:

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

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

  1. デフォルトACLはディレクトリレベルでのみ使用できます。
  2. そのディレクトリ内で作成された任意のサブディレクトリやファイルは、親ディレクトリからACLを継承します。一方、ファイルはアクセスACLとしてデフォルトACLを継承します。
  3. デフォルトACLを設定するには、デフォルト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」コマンドが「read」および「execute」の新しいACLを「Music」フォルダに設定します。

[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」であるディレクトリを作成し、そのディレクトリにユーザー「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: 今、’setfacl’を使用してACLを設定しましょう。’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’フォルダーで’実行’許可を与え、その後’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のドキュメント

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/