2019年4月9日火曜日

CentOS7でgidを変更したらそのユーザがsambaに接続できなくなる場合(レア)

通常はこんなことは起きませんのでご安心ください。

samba 4.8になったときに行われたsambaによるsmb.confの内容からのserver roleの決定方法の解釈変更に伴うトラブルです。

まず、最近のLinuxディストリビューションはむやみやたらと増えたシステム用ユーザのせいで、999までとか1000までとか、同じディストリビューションでもバージョンが上がるにつれて大きめに取られるようになったことが多くなりました。

十年越しで使用しているシステムですとユーザ用uidの開始は大きくても500から、ということが多かったですし、macも(501だったかな)そうだったように思います。

通常は/etc/login.defsのUID_MINを下回っていても別に何の問題もないのですが、ちょっとしたところでこれが問題になる場合があります。
たとえば、nfs利用時にuidを一致させる場合とか、ubuntuとかでログインできなくなるとか、地味なところで環境が混在しているとデメリットが生じる場合があります。

そこで、uidとgidを変更してみました。
といっても手順は非常に簡単で、uidの場合は、
usermod -u 新しいuid ユーザ名
とするだけでhome 以下はすべて面倒を見てくれます。

gidはちょっと面倒です。たとえば、uid変更と同様に、
usermod -g 新しいgid ユーザ名
とやってみても、プライマリグループは変更できませんよと怒られる場合がありますので、一度ダミーのグループを用意して、
usermod -g ダミーグループのgid ユーザ名
を行ってから元のグループをgroupdelコマンドで削除し、そのうえでgroupaddコマンドで本命の新しいグループを作ったうえで、
# usermod -g 本命の新しいグループid ユーザ名
を行い、その後ダミーのグループの削除を行う必要があって少々ヤヤコシイです。

あとは、usermodコマンドではhomeディレクトリ以外にあるファイルのuidおよびgidは面倒を見てくれませんので、自力で変更する必要があります。

といっても、元のuidを持つファイルを探し出してchownとchgrpするだけです。
たとえば、以下のようにします。
# find / -uid 古いuid -print0 | grep -vzZ ^/proc/ | xargs -0 chown -h

ちょっとした注意点としては、1)ファイル名にスペースが入っていたりする場合にxargsが失敗するのと、2)シンボリックリンクのリンク先がない場合にchownとchgrpが失敗するので、
1)の対策としてfindに-print0, xargsに -0, /procは除きたいのでgrepで除外する際にnull終端文字対策用にzZを、それぞれ指定してあげて、
2)の対策として chown, chgrpに-hを渡してあげます。

さて、ここまでやると、表題のトラブルに遭遇する場合があります。

これは、samba4.8以前にpdbedit でsambaのユーザを作った場合で、かつ、明示的にserver roleをstandaloneにしていなかった場合にこうなります。

というのは、pdbedit -L -vしてみるとわかりますが、passwd.tdbの中に、
Forcing Primary Group to 'Domain Users' for gidを変更したユーザ
という定義が勝手に定義されてしまっているからです。

これが何が問題なのかというと、なぜかsambaは新しいgidにお構いなく古いgidにマップしようとして失敗して、接続を拒否するからです。

従って、pdbedit -xでユーザを一度削除してから、再度追加してあげることでプライマリグループの強制割り当てを解除することで解決します。

以上です。
もっとも、こんなことに遭遇する人などこの世に私だけのような気がします。
お読みいただいてありがとうございました。

0 件のコメント:

コメントを投稿