사용자가 특정 포트 (예 : 5000)의 특정 컴퓨터에 SSH 터널을 설정하도록 허용하고 싶지만이 사용자를 가능한 한 많이 제한하고 싶습니다. (인증은 공개 / 개인 키 쌍으로 이루어집니다).
관련 ~ / .ssh / authorized_keys 파일을 편집해야한다는 것을 알고 있지만 여기에 어떤 콘텐츠를 넣을지 정확히 모르겠습니다 (공개 키 제외).
사용자가 특정 포트 (예 : 5000)의 특정 컴퓨터에 SSH 터널을 설정하도록 허용하고 싶지만이 사용자를 가능한 한 많이 제한하고 싶습니다. (인증은 공개 / 개인 키 쌍으로 이루어집니다).
관련 ~ / .ssh / authorized_keys 파일을 편집해야한다는 것을 알고 있지만 여기에 어떤 콘텐츠를 넣을지 정확히 모르겠습니다 (공개 키 제외).
답변:
우분투 11.10에서 -T를 사용하거나 사용하지 않고 전송되는 ssh 명령을 차단하고 scp 복사를 차단하면서 포트 포워딩을 허용 할 수 있음을 발견했습니다.
특히 나는 localhost : 6379에 바인딩 된 "somehost"에 redis-server가 있는데, ssh 터널을 통해 키 파일이 있고 ssh를 사용하는 다른 호스트와 안전하게 공유하고 싶습니다.
$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost
이렇게하면 "somehost"의 redis-server "localhost"포트 6379가 ssh 명령을 실행하는 호스트에 로컬로 나타나고 "localhost"포트 16379로 다시 매핑됩니다.
원격 "somehost"에서 내가 authorized_keys에 사용한 것입니다.
cat .ssh/authorized_keys (portions redacted)
no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost
no-pty는 터미널을 열려는 대부분의 ssh 시도를 수행합니다.
permitopen은 전달이 허용되는 포트를 설명합니다.이 경우 포트 6379는 전달하려는 redis-server 포트입니다.
command = "/ bin / echo do-not-send-commands"는 누군가 또는 무언가가 ssh -T 등을 통해 호스트에 명령을 보낼 수있는 경우 "do-not-send-commands"를 다시 표시합니다.
최근 Ubuntu man sshd
에서 authorized_keys / 명령은 다음과 같이 설명됩니다.
command = "command"이 키가 인증에 사용될 때마다 명령이 실행되도록 지정합니다. 사용자가 제공 한 명령 (있는 경우)은 무시됩니다.
scp 보안 파일 복사를 사용하려는 시도는 "do-not-send-commands"라는 에코와 함께 실패합니다. sftp도이 구성에서 실패합니다.
이전 답변에서 만든 제한된 쉘 제안도 좋은 생각이라고 생각합니다. 또한 여기에 설명 된 모든 내용은 "man sshd"를 읽고 "authorized_keys"를 검색하여 확인할 수 있다는 데 동의합니다.
~user/.ssh/authorized_keys
소유 할 것 user
, 그리고 user
계정에 액세스하는 데 사용되는 인증 된 키를 관리한다. SSH는 권한에 대해 까다 롭고 ~/.ssh/
그 내용 에 대한 기대를 부과 할 수 있습니다 . 나는 a를 sudo chown root: .ssh/authorized_keys
했고 그것은 내가 로그인하는 것을 막는 것 같지만, 과거 경험을 통해 사용자가 해당 파일을 소유 할 필요가 없다는 것을 알고 root
있습니다. 원한다면 관리 할 수 있습니다.
사용자의 셸을 제한된 셸로 설정하고 싶을 것입니다 . 사용자의 ~ / .bashrc 또는 ~ / .bash_profile에서 PATH 변수를 설정 해제하면 명령을 실행할 수 없습니다. 나중에, 당신은 당신처럼, 제한된 명령을 실행하기 위해 사용자를 허용 할 결정하는 경우 less
또는 tail
예를 들어, 당신은 (예 : 별도의 디렉토리에 허용 된 명령을 복사 할 수 있습니다 /home/restricted-commands
)와에 지점의 경로를 업데이트 그 디렉토리.
ssh use@host "/bin/bash"
.
user@host
. rbash가 셸로 있다고 가정합니다 . The Restricted Shell
/bin/bash
되므로 슬래시가 포함되어 실행에 실패합니다.
less
것은 아마도 나쁜 생각 이라고 말해야하지만 , 거기에서를 사용하여 무제한 쉘로 탈출 할 수 있기 때문입니다 !/bin/bash
. 다른 예는 pen-testing.sans.org/blog/2012/06/06/… 을 참조하십시오 . 따라서 개별 명령을 허용하는 것은 매우 조심스럽게 수행해야합니다.
no-X11-forwarding과 같은 authorized_keys 옵션 외에 실제로 요청하는 옵션이 정확히 하나 있습니다 : permitopen = "host : port". 이 옵션을 사용하면 사용자는 지정된 호스트 및 포트에 대한 터널 만 설정할 수 있습니다.
AUTHORIZED_KEYS 파일 형식에 대한 자세한 내용은 man sshd를 참조하십시오.
no-pty
셸 액세스를 제한하지도 않습니다 . 여전히 셸에 액세스 할 수 있으며 프롬프트를 표시하지 않습니다. 여전히 명령을 내리고 출력을 잘 볼 수 있습니다. command="..."
에서 셸 액세스를 제한 하려면이 옵션 이 필요합니다 .ssh/authorized_keys
.
내 해결책은 대화 형 쉘없이 터널링 만 할 수있는 사용자에게 / etc / passwd의 해당 쉘 을 / usr / bin / tunnel_shell로 설정하는 것 입니다.
무한 루프 가있는 / usr / bin / tunnel_shell 실행 파일을 만드십시오 .
#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0
여기에 자세히 설명되어 있습니다. http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
tunnel_shell
, 당신은 할 수 있습니다 shell -> /bin/bash tunnel_shell
당신은 물론 쉘에 다시 탈출 할 수 있도록,하지만 당신이 설정 한 경우 tunnel_shell
로 사용자의 쉘, 당신은 단지 한 것이다 /bin/bash tunnel_shell
탈출 할 수없는 쉘, 실행 , 최대한 멀리 볼 수. 나는 그것을 테스트했고 ctrl-z로 탈출 할 수 없었다. 당신이 경우 한 사용자가 설치를 게시 할 수있는, 그것을 시도하고 탈출 할 수? 마찬가지로, 그렇게 작동해야한다는 문서를 알고 있다면 게시 할 수 있습니까?
로그인을위한 공개 키를 사용하여 authorized_keys 파일을 설정할 수 있습니다. 확실하지 않은 것은 해당 계정이 수행 할 수있는 작업을 제한하는 데 필요한 추가 정보입니다. 예를 들어 다음과 같은 명령을 입력 할 수 있습니다.
no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding
당신은 당신의 authorized_keys 파일에 다음과 같은 줄을 원할 것입니다.
permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache
svn과 같은 특정 명령에 대해서만 액세스를 허용하려면 인증 된 키 파일에서 해당 명령을 지정할 수도 있습니다.
command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]
에서 http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks
여기에 유용한 게시물이 있습니다. http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/
아이디어는 다음과 같습니다 (새 제한된 사용자 이름이 "sshtunnel").
useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel
rbash (restricted-bash)를 사용하여 사용자가 할 수있는 작업을 제한합니다. 사용자는 cd (디렉토리 변경)를 할 수없고 환경 변수를 설정할 수 없습니다.
그런 다음 사용자의 PATH 환경 변수 /home/sshtunnel/.profile
를 아무것도 편집 하지 않습니다. 이는 bash가 실행할 명령을 찾지 못하도록 만드는 트릭입니다.
PATH=""
마지막으로 다음 권한을 설정하여 사용자가 파일을 편집하는 것을 허용하지 않습니다.
chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
다음과 같은 C 프로그램을 만들었습니다.
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
if (signo == SIGHUP)
exit(0);
}
int main()
{
signal(SIGINT, &sig_handler);
signal(SIGTSTP, &sig_handler);
printf("OK\n");
while(1)
sleep(1);
exit(0);
}
제한된 사용자의 셸을이 프로그램으로 설정했습니다.
ssh server command
명령은 쉘을 사용하여 실행되고이 쉘은 아무것도 실행하지 않기 때문에 제한된 사용자가 실행하더라도 아무것도 실행할 수 없다고 생각합니다 .
공개 키 인증에 대한이 게시물을 참조하십시오 .
기억해야 할 두 가지 주요 사항은 다음과 같습니다.
chmod 700 ~/.ssh
no-pty
사용자 캔 편집하므로,이 명령 실행을 방지하기위한 아무 조치도 취하지 않습니다 대화 형 seesion을 열 수 없습니다authorized_keys
그는 같은과 액세스 할 수있는 파일의 경우ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
.