사용자가 SSH 터널을 설정하도록 허용하지만 다른 것은 설정하지 않습니다.


97

사용자가 특정 포트 (예 : 5000)의 특정 컴퓨터에 SSH 터널을 설정하도록 허용하고 싶지만이 사용자를 가능한 한 많이 제한하고 싶습니다. (인증은 공개 / 개인 키 쌍으로 이루어집니다).

관련 ~ / .ssh / authorized_keys 파일을 편집해야한다는 것을 알고 있지만 여기에 어떤 콘텐츠를 넣을지 정확히 모르겠습니다 (공개 키 제외).

답변:


91

우분투 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"를 검색하여 확인할 수 있다는 데 동의합니다.


1
동안은 no-pty사용자 캔 편집하므로,이 명령 실행을 방지하기위한 아무 조치도 취하지 않습니다 대화 형 seesion을 열 수 없습니다 authorized_keys그는 같은과 액세스 할 수있는 파일의 경우 ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'.
synapse

4
위에 나열된 @synapse command = "/ bin / echo do-not-send-commands"는 명령을 차단하기위한 것입니다. 메시지를 제공합니다. 위의 전체 설정을 무너 뜨리려는 예제를 의도 했습니까, 아니면 no-pty에 대해서만 언급하고 있습니까?
Paul

관리자는 사용자에게 authorized_keys 파일 또는 포함 디렉터리에 대한 소유권을 부여 할 의무가 없으며 사용자의 홈 디렉터리에도 존재하지 않는다는 점을 언급합니다 (ssh 서버가 해당 위치에 대해 올바르게 구성되었다고 가정)
Daniel Farrell 2014

?? @DanFarrell .ssh / authorized_keys는 루트 또는 휠이 소유합니까?
Andrew Wolfe 2015

@AndrewWolfe는 일반적으로 ~user/.ssh/authorized_keys소유 할 것 user, 그리고 user계정에 액세스하는 데 사용되는 인증 된 키를 관리한다. SSH는 권한에 대해 까다 롭고 ~/.ssh/그 내용 에 대한 기대를 부과 할 수 있습니다 . 나는 a를 sudo chown root: .ssh/authorized_keys했고 그것은 내가 로그인하는 것을 막는 것 같지만, 과거 경험을 통해 사용자가 해당 파일을 소유 할 필요가 없다는 것을 알고 root있습니다. 원한다면 관리 할 수 ​​있습니다.
Daniel Farrell

18

사용자의 셸을 제한된 셸로 설정하고 싶을 것입니다 . 사용자의 ~ / .bashrc 또는 ~ / .bash_profile에서 PATH 변수를 설정 해제하면 명령을 실행할 수 없습니다. 나중에, 당신은 당신처럼, 제한된 명령을 실행하기 위해 사용자를 허용 할 결정하는 경우 less또는 tail예를 들어, 당신은 (예 : 별도의 디렉토리에 허용 된 명령을 복사 할 수 있습니다 /home/restricted-commands)와에 지점의 경로를 업데이트 그 디렉토리.


1
하지만 그렇다고해서 사용자가 ssh 명령 줄에 다른 명령을 지정하는 것을 막지는 못합니다 ssh use@host "/bin/bash".
Fritz

예, 그렇습니다 user@host. rbash가 셸로 있다고 가정합니다 . The Restricted Shell
Jason Day

좋아, 나는 그것을 시도했고 당신이 옳다. 지정된 명령은 로그인 쉘에 의해 실행 /bin/bash되므로 슬래시가 포함되어 실행에 실패합니다.
Fritz

3
허용하는 less것은 아마도 나쁜 생각 이라고 말해야하지만 , 거기에서를 사용하여 무제한 쉘로 탈출 할 수 있기 때문입니다 !/bin/bash. 다른 예는 pen-testing.sans.org/blog/2012/06/06/… 을 참조하십시오 . 따라서 개별 명령을 허용하는 것은 매우 조심스럽게 수행해야합니다.
Fritz

17

no-X11-forwarding과 같은 authorized_keys 옵션 외에 실제로 요청하는 옵션이 정확히 하나 있습니다 : permitopen = "host : port". 이 옵션을 사용하면 사용자는 지정된 호스트 및 포트에 대한 터널 만 설정할 수 있습니다.

AUTHORIZED_KEYS 파일 형식에 대한 자세한 내용은 man sshd를 참조하십시오.


13
또한 옵션 집합의 일부로 "no-pty"를 지정해야합니다. "permitopen"만 사용하면 주어진 호스트 / 포트로 터널을 제한하지만 대화 형 쉘은 계속 허용합니다.
John Hart

allowopen을 사용하여 포트 전달을 제한하면 ssh -w가 요구하는 터널 장치 전달의 종류도 잠깁니까?
flabdablet

5
@JohnHart : no-pty셸 액세스를 제한하지도 않습니다 . 여전히 셸에 액세스 할 수 있으며 프롬프트를 표시하지 않습니다. 여전히 명령을 내리고 출력을 잘 볼 수 있습니다. command="..."에서 셸 액세스를 제한 하려면이 옵션 이 필요합니다 .ssh/authorized_keys.
Aleksi Torhamo

9

내 해결책은 대화 형 쉘없이 터널링 만 할 수있는 사용자에게 / 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/


9
CTRL + Z는 매우 스크립트의 시작에서 (따옴표없이) "함정 ''20"을 추가하십시오 ... 당신의 bash에 대한 전체 액세스 권한을 부여 스크립트에서 벗어날 것
큰 Papoo을

1
힌트 주셔서 감사합니다, 나는 어떤 인터럽트 신호의 트래핑 추가
다니엘 W.에게

1
"쉘"에 / bin / cat을 사용합니다. 잘 작동하는 것 같습니다. cat에 대한 악용을 알지 못하며 충돌을 관리하는 입력 패턴을 찾았더라도 ssh 세션이 종료됩니다.
flabdablet

4
@BigPapoo : 실제로 테스트 했습니까? 어디로 빠져 나갈지 모르겠어요. 당신이 쉘에있어 당신이 실행하는 경우 tunnel_shell, 당신은 할 수 있습니다 shell -> /bin/bash tunnel_shell당신은 물론 쉘에 다시 탈출 할 수 있도록,하지만 당신이 설정 한 경우 tunnel_shell 사용자의 쉘, 당신은 단지 한 것이다 /bin/bash tunnel_shell탈출 할 수없는 쉘, 실행 , 최대한 멀리 볼 수. 나는 그것을 테스트했고 ctrl-z로 탈출 할 수 없었다. 당신이 경우 사용자가 설치를 게시 할 수있는, 그것을 시도하고 탈출 할 수? 마찬가지로, 그렇게 작동해야한다는 문서를 알고 있다면 게시 할 수 있습니까?
Aleksi Torhamo

3

로그인을위한 공개 키를 사용하여 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 


3

여기에 유용한 게시물이 있습니다. 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

0

다음과 같은 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명령은 쉘을 사용하여 실행되고이 쉘은 아무것도 실행하지 않기 때문에 제한된 사용자가 실행하더라도 아무것도 실행할 수 없다고 생각합니다 .



-3

사용자가 사용하는 ssh 클라이언트를 통해 사용자 컴퓨터에 키를 생성합니다. 예를 들어 pUTTY는이 작업을 수행하는 유틸리티를 가지고 있습니다. 개인 키와 공개 키를 모두 생성합니다.

생성 된 공개 키 파일의 내용은 authorized_keys 파일에 저장됩니다.

다음으로 ssh 클라이언트가 공개 키를 생성 한 개인 키를 사용하도록 구성되어 있는지 확인해야합니다. 상당히 간단하지만 사용하는 클라이언트에 따라 약간 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.