SSH를 통해 로그인한 사용자가 IP 네임스페이스 내에 쉘을 갖도록 강제하려고 합니다.
/etc/passwd
쉘을 비슷한 것으로 교체하려고 시도했지만 ip netns exec sshns /bin/bash
성공하지 못했습니다.
다른 아이디어가 있나요? 가능합니까? 안전할까요, 아니면 전혀 안전하지 않을까요?
답변1
이를 처리하기 위해 로그인 셸을 변경할 때의 문제(OP의 예에서와 같이)는 사용자가 sshd
기본 네트워크 네임스페이스에 연결할 때 해당 셸이 다른 네임스페이스 내에서 실행 중이더라도 해당 포트 전달이 기본 네트워크에서 계속 실행된다는 것입니다. 네임스페이스.
제가 생각해낸 솔루션은 네임스페이스와 셸로의 포트 전달 문제도 해결했습니다. 인증 단계가 네트워크 네임스페이스 내에서 수행되므로 네트워크(NIS, SMB 등)를 통한 원격 시스템에 대한 인증이 작동하지 않을 수 있으므로 로컬 계정 사용으로 제한될 수 있습니다.
대상 네임스페이스에서 실행하려면 셸 및 포트 전달이 필요합니다.기본 네임스페이스와 포함된 네임스페이스 사이에 네트워크/경로를 만들 필요가 없습니다..
이를 달성하기 위한 몇 가지 방법/도구는 다음과 같습니다.
xinetd
- 이 점을 지적해준 Stéphane Chazelas에게 감사드립니다. 단일 또는 고정 개수의 네임스페이스를 사용하여 전달하는 경우 xinetd
더 나은 옵션인 것 같습니다 . 예를 들어 파일/etc/xinetd.d/sshd-netns-foo
service sshdnetns
{
type = UNLISTED
socket_type = stream
protocol = tcp
port = 222
wait = no
user = root
server = /sbin/ip
server_args = netns exec NameSpaceName /usr/sbin/sshd -i
}
socat
- 이는 독립적으로 전달을 시작/중지해야 하는 여러 네임스페이스에 socat
적합한 옵션입니다 . 기본 네임스페이스에서 실행:
socat tcp-listen:222,fork,reuseaddr \
exec:'ip netns exec NameSpaceName /usr/sbin/sshd -i',nofork
ncat
- socat
사용할 수 없는 경우 ncat
(내 RHEL 상자에서 nc
) 작업을 수행합니다. 단점 ncat
은 sshd
연결이 ncat
소켓에 직접 연결되지 않고 파이프로 연결되므로 sshd
클라이언트 IP가 표시되지 않아 로그의 유용성이 떨어진다는 것입니다. 또한 추가 중간 프로세스를 실행하게 됩니다 ncat
.
ncat --keep-open --sh-exec "exec ip netns exec NameSpaceName /usr/sbin/sshd -i" -l 222
다른 도구가 있을 수도 있습니다.
sshd -i
이는 사용자 지정 포트 222의 기본 네임스페이스에서 SSH 연결을 허용하며 각 연결은 대상 네임스페이스 내에서 한 번 시작됩니다.
이로써 문제가 해결되었지만 각 네임스페이스에 로그인할 수 있는 사람을 제한해야 합니다. 네임스페이스별 sshd 구성을 만듭니다.
mkdir -pv /etc/netns/NameSpaceName/
cp -Rp /etc/ssh /etc/netns/NameSpaceName/
sshd_config
default와 같이 각 파일에 대한 액세스 제어를 추가합니다 /etc/ssh/sshd_config
.
AllowUsers user1 user2
...그리고/etc/netns/NameSpaceName/ssh/sshd_config
AllowUsers restrictedUser1 restrictedUser2
AllowGroups
... 지침 도 살펴보세요
이제 디렉터리 바인딩을 적용하기 위한 네임스페이스를 다시 만듭니다.
간단한 테스트 결과 사용자 액세스 제어가 예상대로 작동하는 것으로 나타났지만 실제로는 사용하지 않으므로 직접 확인하시기 바랍니다.
/etc/passwd
별도의 및 파일 /etc/shadow
을 별도의 사용자 목록 /etc/group
에 넣으려고 했지만 /etc/netns/NameSpaceName/
빠른 테스트에서는 작동하지 않았습니다. useradd test
네임스페이스 내에서 실패했습니다.
노트:
사용자 정의 포트가 마음에 들지 않으면 macvlan과 같은 듀얼 마스터 포트를 사용하거나 다른 IP 주소를 추가하고 전용 IP의 기본 포트에서 수신 대기할 수 있습니다.
모든 인증, 쉘, 하위 시스템, 포트 전달 등이 처리되므로 sshd
다른 것을 해킹할 필요가 없습니다.
sshd -i
이렇게 실행하면 단점이 있습니다 . 옵션을 man sshd
찾으려면 계속 읽어보세요 -i
. 네임스페이스 내에서 풀타임으로 실행 sshd
하고 전달 데몬을 다음과 같이 변경하면 문제를 쉽게 해결할 수 있습니다.
nc --keep-open --sh-exec "exec ip netns exec NameSpaceName nc localhost 22" -l 222
마운트 및/또는 사용자 네임스페이스(네트워크 네임스페이스 외에)를 사용하여 이 문제를 더 깔끔하게 해결할 수 있는지 궁금합니다. 나는 이것에 대한 경험이 없습니다.
이를 달성하는 더 좋은 방법이 있을 수 있으며 저는 다른 사람들의 생각에 매우 관심이 있습니다.
답변2
인수 없이 사용자 쉘을 단일 명령의 전체 경로 이름으로만 설정할 수 있습니다.
여러 명령이나 매개 변수가 있는 명령을 실행하려면 쉘 스크립트를 작성하고 실행 가능하게 만든 다음 사용자의 쉘을 스크립트로 설정하십시오.
예를 들어
printf '#!/bin/sh\n%s\n' 'exec ip netns exec sshns /bin/bash "$@"' > /usr/local/bin/myshell.sh
chmod a+rx /usr/local/bin/myshell.sh
chsh -u user -s /usr/local/bin/myshell.sh
ip netns exec sshns /bin/bash
작동하는지 모르겠습니다 . 아직 테스트하지 않았습니다. 유효한 명령처럼 보이지는 않지만 유효한 명령이거나 하나를 생각해 낼 수 있다고 가정합니다. 즉, 사용자의 쉘이 작동할 수 있도록 쉘 스크립트를 사용하여 테스트했습니다. 그냥 exec /usr/bin/zsh
스크립트에 있어요.