なぜ /bin/false がログインシェルでも ssh の -NL オプションでポート転送ができるのでしょうか?


タイトルの通りなのですが、なぜ `/bin/false` がログインシェルでも-NLオプションでポート転送ができるのでしょうか。  
試したところ、`/sbin/nologin` ではポート転送はできませんでした。

自分で調べたところ、`/etc/shells` に追加すると、FTP などを使うことができたりするということは納得したのですが、しかし試した環境では
`/bin/false` も `/sbin/nologin` も `/etc/shells`
に追加していません。ご教授いただけましたら幸いです。どうかよろしくお願いします。

サーバの環境は Debian 7.10、sshd のバージョンは OpenSSH_6.0p1 Debian-4+deb7u4, OpenSSL 1.0.1e
11 Feb 2013 です。  
クライアントの ssh のバージョンは OpenSSH_6.9p1, LibreSSL 2.1.8 です。




SSH サーバー `sshd`(8) がユーザーのシェルの存在を確認し、存在しないときには拒否するからです。Debian なら認証動作については
`/var/log/auth.log` を確認しましょう。次のようなログがあると思います。

[code]

    Apr 30 19:07:17 sugar sshd[13663]: User fumiyas not allowed because shell /sbin/nologin does not exist
    
[/code]

`sshd` はファイルが存在して所有者か所有グループかそのほかの実行権限が付いているかどうかだけ確認しているので、例えば次のようにすると SSH
ポート転送が許可されます。

[code]

    # touch /sbin/nologin
    # chmod 0100 /sbin/nologin
    
[/code]

Debian / Ubuntu には `/sbin/nologin` は存在しませんが、`/usr/sbin/nologin`
は存在して実行権限が付いているので、そいつをシェルに指定すればポート転送できます。

`sshd` 自身は `shells`(5) は評価しません。必要であれば `sshd_config`(5) で `UsePAM yes`
を設定し、`pam.conf`(5) で `pam_shells`(8) を利用することになります。

