web-dev-qa-db-ja.com

Samba共有権限により、ファイルの書き込みが拒否されましたが、引き続き表示されます

非常に奇妙な問題...

リモートのSamba共有:

[javaerpm]
    path = /u/abas/erpm/Java
    force user = erpm
    guest ok = yes
    read only = no
    writeable = yes

Rootを使用してローカルにマウントコマンド:

root@crunchbang:/mnt/abas# mount -t cifs -o username=guest,rw,exec,auto //10.0.0.2/javaerpm ./javaerpm

ルートは問題なく読み取り/書き込み/ CDを実行できます。

root@crunchbang:/mnt/abas# cd javaerpm
root@crunchbang:/mnt/abas/javaerpm# touch test
root@crunchbang:/mnt/abas/javaerpm# ll
total 1
-rw-r--r--  1  501 users   0 Sep 24 09:55 test
root@crunchbang:/mnt/abas/javaerpm# rm test

しかし、通常のユーザーに切り替えて同じことをすると、次のようになります。

shawn@crunchbang:/mnt/abas/javaerpm$ touch test
touch: cannot touch `test': Permission denied

llを実行すると、とにかくファイルを書き込んだことがわかります。

shawn@crunchbang:/mnt/abas/javaerpm$ ll
total 1
-rw-r--r--  1  501 users   0 Sep 24 09:55 test

rmでも問題ありません:

shawn@crunchbang:/mnt/abas/javaerpm$ rm test
shawn@crunchbang:/mnt/abas/javaerpm$

さまざまなマウントオプションを試しました。 uid=501は何も変更しません。 nounixを試してみましたが、まったく機能せず、rootまたはShawnユーザーを使用して何も表示されません。

12
shrimpwagon

注:私が推測しているのは、サンバの第一人者ではありません。

Samba/CIFSは、少なくともここでの使用方法では、サーバーとクライアント間の資格情報を再現しません。サーバー上のforce userディレクティブのため、すべての操作はサーバー上のユーザーerpmとして実行されます。ただし、クライアントとサーバーの両方がUNIXシステムを実行しているため、 CIFS POSIX extensions が自動的にネゴシエートされました。これにより、UNIXのアクセス許可はある程度までは機能しているように見えますが、サーバーが許可する範囲内に限られ、UNIXのアクセス許可が要求するものとサーバーが許可するものとが異なる場合があります。

すべてのファイルがユーザーID 501として表示されていることがわかります。これがサーバー上のユーザーのuidです。

ファイルを作成または削除しようとすると、ディレクトリに対する書き込み権限が必要になります。すべてのアクセスはサーバー上の1人のユーザーにマップされるため、書き込み権限は、erpmがサーバー上のそのディレクトリへの書き込みを許可されているかどうかを示します。答えはイエスです。

touchを実行すると、ファイルが作成され、変更時刻が変更されます。ファイルの変更時刻を変更するには所有権が必要であり、これはクライアント側の汎用ファイルシステムコードによってテストされます。

strace touch testを実行すると、open呼び出し(ファイルを作成する)が成功し、次に utimes 呼び出し(Linuxでは utimensat システムコール)は時間の設定に失敗します。

utimesはNULL引数を使用してそれを呼び出すため(「タイムスタンプを現在の時刻に設定する」)、touchshouldが成功するため、これは実際には少し奇妙です。これは、任意のタイムスタンプを設定するような所有者だけでなく、ファイルに書き込む可能性のあるすべての呼び出し元に許可されることになっています。 utimensatが実際に権限ベースのチェックを行っており、ファイルシステムが実際の権限に関係なく書き込み操作を許可している場合でも、そのファイルへの書き込みはできないと判断していると思います。

非rootユーザーの権限でサーバー側が実行されている場合のCIFS POSIX拡張の主な利点は、実行可能ビットを引き継ぐことであり、場合によってはグループの所有権も引き継がれます。 forceuidマウントオプションを使用して、ユーザーの所有権を単一のクライアント側ユーザーにマッピングすると、混乱が少なくなる場合があります。