使用ニックスパッケージマネージャ、私がインストールしました魚私のログインシェル用。シェルを追加しました/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_t
inode 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がアクティブな状態でログインしようとしている場合です。最後の行は成功したログインです。
上記の出力をパイプすることで、audit2allow
SELinuxの観点から見るべきことは次のとおりです。
#============= 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を使用してログインできるようになりました。