점프 호스트에서 SSH ForceCommand는 얼마나 안전합니까?


8

네트워크에 다음과 같은 설정이 있습니다.

Internet <--> Bastion <--> Local Network

여러 사용자가 있으며 각 사용자는 특정 컴퓨터에 할당되어 있습니다. 즉, 각 사용자는 해당 서버 중 하나에 만 액세스 할 수 있어야합니다. 예 : User1-> Machine1, User2-> Machine2 등.

이 사용자는 내 네트워크 외부에서 연결하며 배스 천 호스트를 통해 내 네트워크로 연결을 전달하는 방법을 많이 고려했습니다.

결국 나는 Match Blocks와 forcecommand를 선택했습니다.

따라서 요새에 대한 내 / etc / ssh / sshd_config는 다음과 같습니다.

Match User User1
        ForceCommand ssh User1@Machine1 $SSH_ORIGINAL_COMMAND

User1은 배스 천 호스트에 연결하여 Machine1과 자동으로 연결됩니다.

ForceCommand를 이해하는 한 User1은 요새 호스트에 실제로 액세스 할 수 없습니다. 모든 작업이 일치 블록에서 먼저 처리되므로 Machine1로 다시 라우팅되기 때문입니다. 그러나 이것이 사실입니까? 보안 설정으로 충분합니까? 어쨌든 사용자는 Machine1에 투옥되어 있기 때문에 많은 가능성이 없습니다.


2
IPv6을 확보해야하므로 더 이상 점프 상자가 필요하지 않습니다.
Michael Hampton

답변:


6

요새 호스트를 사용하는 방법 은이 예와 같이 ProxyCommand-W플래그를 사용하는 것입니다 .

ssh -o ProxyCommand='ssh -W %h:%p user@bastion' user@machine

보안상의 이유로이 방법을 사용합니다. 클라이언트와 대상 시스템 간의 통신은 종단 간 암호화되어 인증되므로 요새가 손상 되더라도 보안 상태를 유지합니다. 감염된 요새 호스트는 요새없이 ssh end-to-end를 사용하는 것보다 더 적은 보안을 제공합니다.

또한 에이전트 전달을 사용할 필요가 없습니다. 클라이언트는 키 기반 인증을 먼저 사용하여 요새에 액세스 한 다음 클라이언트에있는 개인 키를 악용하는 데 사용할 수있는 에이전트 연결이 제공되지 않은 대상 호스트에 다시 액세스 할 수 있습니다.

또한 요새 호스트에 의존하는 코드를 제한합니다. 요새에서 전혀 명령을 실행할 필요가 없습니다. -W하나의 단일 포트 전달뿐만 아니라 no 명령 플래그를 의미하며,이 포트 전달은 허용되는 모든 요새 호스트입니다.

이 접근법을 염두에두고 위의 구조의 명령 만 사용하도록 요새 호스트를 가능한 한 많이 잠그는 것이 좋습니다.

~/.ssh/authorized_keys요새에 파일은 루트가 소유 할 수있다 (그것에 파일 시스템의 루트에서 경로에있는 모든 디렉토리 수로), 이것은 누군가가에 권한이없는 사용자로 휴식을 관리하는 경우에도이 수정 될 수있는 위험을 감소 요새 호스트.

에서 authorized_keys클라이언트의 권한이 옵션을 사용하여 제한 할 수 있습니다 command, no-agent-forwarding, no-pty, no-user-rc, no-X11-forwarding,뿐만 아니라 사용하는 등 permitopen으로 제한 포트 포워딩 만이 사용자에 대한 액세스를 허용하는 호스트의 포트 22에 액세스 할 수 있습니다.

원칙적으로이 방법은 여러 사용자가 요새에서 단일 사용자 이름을 공유하더라도 안전합니다. 그러나 요새에서 별도의 사용자 이름을 사용하면 약간 더 분리됩니다.


요새 자체에서 ssh 바이너리를 호출하는 것으로 보입니다. 이 경우 요새가 손상되면 공격자는이 ssh 바이너리를 통신을 덤프하는 바이너리로 바꿀 수 있습니다. 명령 줄에서 경로 (예 : / usr / bin / ssh)를 사용하지 않기 때문에 공격자는 홈 디렉토리에 넣고 PATH를 변경하거나 별칭을 사용하여 요새에 대한 루트 액세스 권한이 없어도 그렇게 할 수 있습니다. ssh). 그냥 내 2 센트.
George Y.

1
@GeorgeY. 당신은 잘못. 두 ssh명령 모두 클라이언트에서 실행 중입니다. 그것이 바로 제가 제안한 방식으로하는 것입니다. 이 질문에서 언급 한 접근 방식 ssh은 요새에서 실행 되며 광범위한 공격 벡터가 열립니다.
kasperd

2

쉘이 시작될 때 ForceCommand가 시작되기 때문에 ForceCommand를 쉽게 우회 할 수 있습니다. 이것은 본질적으로 쉘 rc 파일이 먼저 처리 된 다음 ForceCommand가 도달하도록 허용하면 강제 실행됨을 의미합니다. exec sh쉘에서 rc 파일을 단순 하게하면 다른 쉘이 생성되고이 쉘을 종료 할 때까지 ForceCommand를 대기 상태로 유지합니다.

결론은 다음과 같습니다. 사용자가 ftp, sftp, scp 또는 다른 방법으로 쉘 rc (예 : .bashrc)를 편집 할 수 있다면 ForceCommand는 실제로 의존하지 않습니다.


좋아, 나는 그것을 시도 할 것이다. 해당 사용자는 파일 변경을 수행하기 위해 요새 호스트에 액세스 할 수 없습니다. .bashrc를 변경할 수있는 대상 호스트에만 액세스 할 수 있습니다. 그러나 나는 당신이 요새 호스트와 관련이 있다는 것을 올바르게 이해하기를 바랍니다.
Dr.Elch

1
사용자가 bashrc 파일을 변경하기 위해 시스템에 로그인 할 수있는 경우에만 문제가됩니다. 이러한 계정을 정상적으로 사용하지 않으려면 루트가 소유 한 디렉토리와 루트가 소유 한 거의 모든 파일을 루트가 소유 할 수 있습니다. .ssh 파일의 소유권에 관한 규칙을 확인하십시오. 그러나 .bashrc와 같은 것은 쓸 수 없습니다.
mc0e

예 @ Dr.Elch는 실제로 요새 호스트의 보안을 언급하고있었습니다. 고려할 수도 있습니다. chattr + i를 사용하여 쉘 rc를 변경 불가능으로 설정하고 사용자가 쉘을 옵션으로 변경할 수 없도록합니다.
Hrvoje Špoljar

1

나는 그것이 대부분의 경우는 좋다고 생각하지만, 보안의 문제는 아직 아무도 생각하지 못한 것들입니다. 보장은 없습니다.

예를 들어 오랫동안 bash의 환경 변수에서 함수를 생성하는 방법에 대해 너무 열심히 생각한 사람은 없었지만 최근 사람들은이를 파괴 할 수 있다는 사실을 깨달았으며 그 영향 중 하나는 ForceCommand가 사용자의 셸이 bash 인 경우 최소한 Authorized_keys 파일에 구현 된대로) 배쉬가 고쳐졌고 버전이 최신 버전이지만, 이런 일이 발생하기를 바랍니다.

ForceCommand를 정의하는 것이 authorized_keys 파일에서 해당 명령을 정의하는 것과 실제로 동일한 지 확실하지 않습니다. 나는 그것을 자세히 보지 않았습니다.


0

사용자 로그인으로 실행중인 sshd 가 .bashrc소유 root:usergrp하지만 여전히 읽을 수 있도록합니다. 사용자가 새 파일을 만들 수 없도록 $ HOME에서 perms / owner를 설정하십시오. 이 방법으로 root는의 내용을 제어 .bashrc하여 필요한 것을 수행 할 수 있지만 사용자 자신은 해당 설정이나 파일 / 디렉토리에 대한 권한을 변경하여 내용을 변경할 수 없습니다 .bashrc.


요새 서버에서 해당 사용자에게 홈 디렉토리를 할당하지 않는 것은 어떻습니까?
Dr.Elch

.bashrc다음에 실행하려는 명령이 있는 with 를 어디에 저장 하시겠습니까?
Marcin

접속 서버에서 연결을 실제 호스트로 전달하는 force 명령은 sshd_config에 정의되어 있습니다. 따라서 해당 요새 호스트에서 더 이상 명령을 지정할 필요가 없습니다.
Dr.Elch

0

다른 생각이 있습니다. 요새 서버의 각 사용자에 대해 / etc / passwd에서 쉘을 ssh user1 @ machine1, user2 @ machine2 등을 실행하는 bash 스크립트로 정의 할 수 있습니다. 이렇게하면 유효한 서버가 없는지 확인할 수 있습니다. 서버 자체의 쉘에 연결되어 있어야합니다.


이것을 시도 했습니까? 이 아이디어는 나에게 일어 났으며 그것이 얼마나 잘 작동하는지 궁금합니다.
William Pietri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.