Linuxでグループ権限があるにもかかわらずディレクトリに書き込めない
1. 概要
このチュートリアルでは、ユーザーアカウントにグループ権限があるにもかかわらず、ディレクトリへの書き込みを妨げるエラーを調査します。 ユーザーアカウントの権限、設定、ディレクトリ権限、 ACL 、およびハードウェアステータスを確認します。
2. 問題の紹介
次の手順を実行することで、問題を再現できます。
- ディレクトリを作成する
- ディレクトリの所有権を特定のグループに設定します
- 現在のユーザーアカウントをそのグループに追加します
- ディレクトリにファイルを作成しようとすると、エラーが発生します
問題を段階的に見ていきましょう。 アカウントuser_aを、次のユーザー設定で使用しています。
$ id
uid=1000(user_a) gid=1000(user_a) groups=1000(user_a),27(sudo),998(docker)
$ groups
user_a sudo docker
次に、ディレクトリを作成し、その所有権をrootおよびstaffグループのユーザーに設定します。
$ mkdir sampledir
$ sudo chown root:staff sampledir
[sudo] password for user_a:
$ ls -l
total 4
drwxrwxr-x 2 root staff 4096 Apr 1 10:44 sampledir
次に、user_aをstaffグループに追加します。
$ sudo usermod -a -G staff user_a
最後に、 touch コマンドを使用してファイルの作成を試みます。これにより、エラーがスローされます。
$ touch sampledir/samplefile.txt
touch: cannot touch 'sampledir/samplefile.txt': Permission denied
必要なことはすべて行ったように見えるので、そのエラーは発生しないはずです。 次のセクションでは、エラーの原因を調査します。
3. ソリューション
上記の問題に対処する方法はいくつかあります。 それらのいくつかを試してみましょう。
3.1. ユーザー権限と設定を確認する
user_aをstaffグループに追加するなどのグループを変更した後、コンソールがこれらの変更をロードすることを確認する必要があります。
$ id
uid=1000(user_a) gid=1000(user_a) groups=1000(user_a),27(sudo),998(docker)
$ groups
user_a sudo docker
上記のように、使用しているコンソールは変更によって更新されていません。 user_aはまだスタッフグループに含まれていません。
新しいコンソールを開くか、実行中のコンソールで su – user_a を実行することにより、変更を適用できます。
$ su - user_a
Password:
$ id
uid=1000(user_a) gid=1000(user_a) groups=1000(user_a),27(sudo),50(staff),998(docker)
$ groups
user_a sudo staff docker
$ touch sampledir/samplefile.txt
$ ls -l sampledir
total 0
-rw-rw-r-- 1 user_a user_a 0 Apr 1 11:36 samplefile.txt
この時点で、ディレクトリに変更を加えることができるはずです。 失敗した場合は、次のセクションに進みましょう。
3.2. ディレクトリACLを確認する
このケースはまれかもしれませんが、ディレクトリのACL(アクセス制御リスト)を確認する必要がある場合があります。 たとえば、特定のユーザーやグループのデフォルトACLを使用して作成できた可能性があります。
ディレクトリ権限の最後にプラス(+)記号が表示されている場合は、ディレクトリに特別なアクセスルールがあることを示しています:
$ ls -l
total 4
drwxr-xr-x+ 2 root staff 4096 Apr 1 11:55 sampledir
getfaclコマンドを使用してディレクトリACLを確認しましょう。
$ getfacl sampledir
# file: sampledir
# owner: root
# group: staff
user::rwx
user:user_a:r-x
group::r-x
mask::r-x
other::r-x
行user:user_a:rx は、user_aがsampledirディレクトリへのrxアクセスのみを持っていることを示しています。
setfacl コマンドを使用してルールを変更し、それらを確認してみましょう。
$ sudo setfacl -m u:user_a:rwx ./sampledir
$ getfacl sampledir
# file: sampledir
# owner: root
# group: staff
user::rwx
user:user_a:rwx
group::r-x
mask::rwx
other::r-x
この時点で、ACLは正常に変更されており、user_aを使用してそのディレクトリに変更を加えることができるはずです。
$ touch sampledir/samplefile.txt
$ ls sampledir/ -l
total 0
-rw-r--r-- 1 user_a user_a 0 Apr 1 12:41 samplefile.txt
それでもディレクトリに変更を加えることができない場合は、次のセクションに進みましょう。
3.3. システムを再ログインまたは再起動します
システムを再ログインまたは再起動して、システムが行ったすべての変更を確実にロードできるようにします。
再度ログインして再起動した後、ディレクトリにいくつかの変更を加えることができます。 同じエラーが発生する場合は、もう1つのオプションがあります。
3.4. パーティションまたはハードウェアを確認してください
障害のあるハードディスクは、使用しようとするとエラーをスローするか、マウントオプションが正しくないパーティションをスローする可能性があります。次に例を示します。
$ mkdir test
mkdir: cannot create directory test: Read-only file system
$ touch test
touch: cannot create file test: Read-only file system
/ etc / fstab のパーティションのマウントオプションが正しいことを確認してから、パーティションを再マウントすることで、問題の修正を試みることができます。
パーティションを再マウントするには、まず、 mount コマンドを実行して、パーティションがマウントされていることを確認します。
$ mount
...
/dev/sda3 on / type ext4 (rw,relatime,errors=remount-ro)
...
次に、パーティションを再マウントします。
$ sudo mount -o remount /
この時点で、ディレクトリに変更を加えようとしてもエラーが発生する場合は、ハードウェアの問題の可能性を調査する必要があります。
4. 結論
この記事では、ユーザーアカウントの権限と設定、ディレクトリの権限、ACL、およびハードウェアステータスを確認することにより、グループの権限があるにもかかわらずディレクトリへの書き込みを妨げるエラーを調査しました。