Fish(Nix経由でインストール)をシェルとして使用している場合、SSHは使用できません。

Fish(Nix経由でインストール)をシェルとして使用している場合、SSHは使用できません。

使用ニックスパッケージマネージャ、私がインストールしました私のログインシェル用。シェルを追加しました/etc/シェル:

$ bat /etc/shells | grep --color=auto fish
/home/ajgringo619/.nix-profile/bin/fish

これは、Debian、Fedora、Gentoo、Ubuntu、openSUSEなど、すべてのシステムで機能します。問題はFedoraの帽子(v37を使用)とSSH接続。他のシステムはすべて機能しますが、Fedoraシステムではログインシェルが存在しないと主張します。

$ which fish
/home/ajgringo619/.nix-profile/bin/fish
$ journalctl -fu sshd.service 
Dec 26 11:30:50 fedora sshd[977]: Server listening on 0.0.0.0 port 22.
Dec 26 11:30:50 fedora sshd[977]: Server listening on :: port 22.
Dec 26 11:30:50 fedora systemd[1]: Starting sshd.service - OpenSSH server daemon...
Dec 26 11:30:50 fedora systemd[1]: Started sshd.service - OpenSSH server daemon.
Dec 26 11:31:46 fedora-cin sshd[2030]: User ajgringo619 not allowed because shell /home/ajgringo619/.nix-profile/bin/fish does not exist
Dec 26 11:31:57 fedora-cin sshd[2030]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.122.1  user=ajgringo619
Dec 26 11:32:00 fedora-cin sshd[2030]: Failed password for invalid user ajgringo619 from 192.168.122.1 port 39226 ssh2
Dec 26 11:32:11 fedora-cin sshd[2030]: Connection closed by invalid user ajgringo619 192.168.122.1 port 39226 [preauth]

レビューの結果、/etc/ssh/sshd_configインストール後に変更されたことはありません。どんなアイデアでも?Fedoraの帽子他の人はこのようなことをしませんか?私がいたとき、これは起こりませんでした。インストールしてdnf

アップデート#1:これはselinuxの問題です。 selinuxを「許可」に変更した後、この問題は解決されました。しかし、私はデフォルト設定を維持するためにselinuxが実行するアクションを編集したいと思います。

ベストアンサー1

fish次のSELinuxコンテキストを使用してインストールしますdnf/usr/bin/

$ ls -laZ $(which fish)
-rwxr-xr-x. 1 root root system_u:object_r:shell_exec_t:s0 1721760 Jan 31 15:35 /usr/bin/fish

気づくshell_exec_t!それでは、Nix経由でフィッシュをインストールしてみましょう。

# Download Nix
$ sh <(curl -L https://nixos.org/nix/install)

# Source profile
$ . ~/.nix-profile/etc/profile.d/nix.sh

# Install Fish
$ nix-env -iA nixpkgs.fish

fishバイナリをもう一度確認してみましょう。

$ which fish
/home/edward/.nix-profile/bin/fish

$ ls -laZ $(which fish)
lrwxrwxrwx. 1 edward wheel unconfined_u:object_r:default_t:s0 63 Jan  1  1970 /home/edward/.nix-profile/bin/fish -> /nix/store/4mh0j2gm92dwin2dx4v6rhhjr01d6q5y-fish-3.6.0/bin/fish

これで文脈があることがわかりますdefault_t

fishこれをデフォルトのシェルに設定してみましょう。

$ sudo usermod -s $(which fish) edward
$ cat /etc/passwd|grep edward
edward:x:1000:10::/home/edward:/home/edward/.nix-profile/bin/fish

大丈夫。今SSH経由でログインすると、あなたがedward言ったように動作しません。 SELinux AVC拒否ログを確認してみましょう。

$ sudo ausearch -ts recent -m avc -i
----
type=AVC msg=audit(02/17/2023 20:01:31.125:440) : avc:  denied  { read } for  pid=2642 comm=sshd name=profile dev="dm-0" ino=839852 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=lnk_file permissive=0

したがって、コンテキストsshdで実行すると、sshd_tinode 839852のファイルへのアクセスは許可されません。どんな文書?

$ sudo find / -xdev -inum 839852
/nix/var/nix/profiles/per-user/edward/profile

結論は次のとおりです。 NixはSELinuxが有効な状態では動作しません。以下の項目はすべて/nixラベルが付いていないためです。

もちろん、独自のポリシーファイルを作成することもできます。これは、Nix 環境で Fish をシェルとして使用して SSH 経由でログインする特定のユースケースにのみ適用されます。

まず、一時的に許可モードに切り替えてSELinuxを無効にします。

$ sudo setenforce 0

今度はログイン操作をやり直しても大丈夫でしょう。 SELinuxを再度有効にします。

$ sudo setenforce 1

同時に失敗するすべてのための戦略モジュールを入手してください。失敗した部分をリストしましょう。

$ sudo ausearch -m avc -ts recent -c sshd
----
time->Fri Feb 17 20:01:31 2023
type=AVC msg=audit(1676660491.125:440): avc:  denied  { read } for  pid=2642 comm="sshd" name="profile" dev="dm-0" ino=839852 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=lnk_file permissive=0
----
time->Fri Feb 17 20:09:11 2023
type=AVC msg=audit(1676660951.340:455): avc:  denied  { read } for  pid=2679 comm="sshd" name="profile" dev="dm-0" ino=839852 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=lnk_file permissive=1
----
time->Fri Feb 17 20:09:11 2023
type=AVC msg=audit(1676660951.342:456): avc:  denied  { getattr } for  pid=2679 comm="sshd" path="/nix/store/4mh0j2gm92dwin2dx4v6rhhjr01d6q5y-fish-3.6.0/bin/fish" dev="dm-0" ino=839796 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=1
----
time->Fri Feb 17 20:09:11 2023
type=AVC msg=audit(1676660951.825:473): avc:  denied  { read } for  pid=2681 comm="sshd" name="profile" dev="dm-0" ino=839852 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=lnk_file permissive=1

最初の行は、SELinuxがアクティブな状態でログインしようとしている場合です。最後の行は成功したログインです。

上記の出力をパイプすることで、audit2allowSELinuxの観点から見るべきことは次のとおりです。

#============= sshd_t ==============
allow sshd_t default_t:file getattr;
allow sshd_t default_t:lnk_file read;

そこくらいです。これを使用してモジュールを作成し、それを実行戦略にインストールします。

$ sudo ausearch -m avc -ts recent -c sshd | audit2allow -M sshd-fish-nix
$ sudo semodule -i sshd-fish-nix.pp

これでSELinuxが有効になっているSSHを使用してログインできるようになりました。

おすすめ記事