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 등 모든 시스템에서 작동합니다. 문제는페도라 모자(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설치 이후 변경된 사항이 없습니다. 무슨 아이디어라도?페도라 모자다른 사람은 이런 일을 하지 않나요? 내가 있었을 때는 이런 일이 일어나지 않았어물고기설치하여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를 통해 Fish를 설치해 보겠습니다.

# 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를 사용하여 로그인할 수 있습니다.

관련 정보