私はUbuntu Linuxを実行しているいくつかのコンピュータを使用する傾向があります。コンソールユーザーを認証する中央サービスが必要です。すべてのユーザーファイル(ホームディレクトリ)は1つの場所になければなりません。 NFS、LDAP、Kerberos、またはMicrosoft Active Directoryを介して共有ファイルサーバーをエクスポートすることを含む(これに限定されない)、これには合理的なソリューションがたくさんあることがわかります。しかし、予算の削減のため、これらのいずれも得られませんでした。私が持っている唯一のものはSamba共有を持つファイルサーバーです。単一の共有では、各ユーザーには自分だけが書き込むことができるターゲットディレクトリがあります。 Samba共有に対してコンソールユーザーを認証できますか?
答え1
ガイドライン
ここにはいくつかの部分があります。
- 認証自体(「このユーザーはこのコンピュータを使用できますか?」)
- アカウントデータには、ユーザー情報、IDマッピング、グループメンバーシップなどが含まれます(データなど
getent passwd
)。
確認する
Samba共有の資格情報(ユーザーとパスワード)を確認するのは比較的簡単です。あなたはそれを使用することができますsmbclient
:
smbclient --user="$PAM_USER" --password="$password" --directory "$PAM_USER" --command="quit" "\\\\fileserver.example.com\\homes"
このコマンドは、資格情報が正しい場合は成功し、サーバーが資格情報を拒否すると失敗します。あなたはそれを使用することができますpam_exec。 pam_execについては、この回答の最後にある完全な例を参照してください$PAM_USER
。$password
これ質問の意図も似ています。
PAMに追加承認するステップは認証を処理しますが、ログイン操作はそれ自体では行われません。
アカウント
実際にシステムを使用するには、システムがユーザーを知っている必要があります。これはネームサービススイッチ(nss)によって処理されます。しかし、私はサンバ関連のモジュールを知りません。さらに、実際には必要ありません。ユーザーが提供した資格情報がSambaサーバーによって確認されていることが既にわかっているので、簡単にローカルユーザーを動的に作成し、同じパスワードを提供できます。また、sambahome
一般のローカルユーザー(ルートなど)とホームページが共有内のユーザーを簡単に区別できるように、ユーザーを特別なグループに追加したいと思います。
adduser "$PAM_USER" --quiet --gecos "" --home "/home/$PAM_USER" --no-create-home --add_extra_groups --disabled-password &&
echo "$PAM_USER:$passwd" | chpasswd &&
adduser "$PAM_USER" "sambahome"
保存
ユーザーのホームディレクトリはSamba共有にあるため、次のものを使用できます。pam_mount共有はログイン中に自動的にマウントされます。
実装する
確認する
これが私のデフォルトで、数行に/etc/pam.d/common-auth
拡張されます。
auth [success=3 default=ignore] pam_unix.so nullok
auth optional pam_exec.so expose_authtok /usr/local/sbin/pam-addsmbuser
auth [success=1 default=ignore] pam_unix.so nullok
auth requisite pam_deny.so
auth required pam_permit.so
auth [success=ok default=1] pam_succeed_if.so quiet_fail user ingroup sambahome
auth optional pam_mount.so
最初の行(含むpam_unix
)はローカルユーザーの資格情報を確認します。
成功すると、次の3行をスキップしてpam_permit
適用されます。
ローカルユーザーがいない場合は、2 行目を検討してください。これpam_exec
により、pam-addsmbuser
新しいローカルユーザーが作成されます。次に、pam_unix
もう一度クエリします(3行目)。
どちらの場合もpam_mount
実行されますが、ユーザーのホームディレクトリが実際にSamba共有にある場合にのみ実行されます。これを保護するpam_succeed_if
ことはオプションですが、認証ログをきれいに保ちます。
アカウント
全体的に/usr/local/sbin/pam-addsmbuser
次のようになります。
#!/bin/sh
read password
if smbclient --workgroup="AD.FH-WEDEL.DE" --user="$PAM_USER" --password="$password" --directory "$PAM_USER" --command="quit" "\\\\fs1.ad.fh-wedel.de\\tux-homes"
then
adduser --disabled-password --gecos "" --home "/home/ad/$PAM_USER" --no-create-home --quiet --add_extra_groups "$PAM_USER" &&
echo "$PAM_USER:$password" | chpasswd &&
adduser "$PAM_USER" "sambahome"
fi
これは$PAM_USER
環境変数であり、$password
標準入力から読み取られます。
保存
関連ライン/etc/security/pam_mount.conf.xml
:
<volume fstype="cifs" server="fileserver.example.com" path="homes/%(USER)" mountpoint="/home/%(USER)" options="uid=%(USER),gid=%(USERGID),dir_mode=0700,file_mode=0700,nosuid,nodev,mfsymlinks" />
<mkmountpoint enable="1" remove="true" />
必要に応じて最後のオプションを調整する必要があります。私はこれについていくつかの感情を持っていますmfsymlinks
。
会議
作業するには、次のpam_mount
地域にもいる必要があります/etc/pam.d/common-session
。
session [success=ok default=1] pam_succeed_if.so quiet_fail user ingroup sambahome
session optional pam_mount.so
結果
私は数ヶ月間この設定を使用してきました。これまでは十分信頼できるようです。
ガイドライン
私が知っている限り、資格情報を確認するこの方法は、ユーザー名とパスワードでのみ機能します。 SSHによる公開鍵認証などのパスワードのない方法は機能しない可能性があります。私は確認しませんでした。
システムはパスワード変更を正しく処理しません。ローカルパスワードを変更すると認証は成功しますpam_unix
が、Sambaサーバーはパスワードを拒否してpam_mount
失敗します。サーバー側のパスワードを変更すると同様の問題が発生します。この問題は、より複雑なスクリプトを使用して解決できます。
ローカル UID はシステムでは同じではありません。しかし、私はこれに問題がないと思います。