소개하다 이것은 답변의 확장을 구하는 질문입니다.SSH 사용자가 SSH 터널만 허용하도록 제한하는 방법
문제 설명 참조의 제안을 구현하여 셸 액세스 없이 사용자를 생성하려고 시도했지만 해당 사용자를 대신하여 터널에 연결할 수 없었습니다.
필요하다 보호되지 않은 원격 컴퓨터(컴퓨터 A)가 내 방화벽으로 다시 역방향 터널을 시작하도록 하고 싶습니다. 기계 A는 사용자 입력이 없는 헤드리스 상자입니다. 그것은 야생에 있고 아마도 방화벽 뒤에 있을 것입니다. 내 방화벽(MyFW)은 Linux 시스템이고 CLI 루트 액세스 권한이 있습니다.
MyFW로 다시 역방향 SSH 터널을 시작하려면 머신 A가 필요합니다. 일반적으로 로컬 터널은 MyFW의 보호된 측에 있는 사용자 시스템 C에 생성됩니다. 로컬 SSH 터널은 필요에 따라 MyFW의 역방향 터널에 연결됩니다.
누군가 머신 A에 침입하여 역방향 터널을 발견하면 역방향 터널을 사용하여 MyFW 터널 항목(포트) 외부의 콘텐츠에 액세스할 수 없도록 하고 싶습니다.
내가 뭘 시도한 거야?
나는 몇 년 동안 SSH와 터널링을 사용해 왔기 때문에 그들의 일반적인 구성과 작동을 이해합니다. 테스트를 위해 컴퓨터 A와 B 두 대를 책상 위에 설치했습니다. 두 시스템 모두 Linux 시스템이며 둘 다 방화벽이 없습니다. 목표는 작동하도록 가장 간단한 설정을 얻는 것입니다.
먼저 머신 A에서 SSH 키를 생성합니다.
ssh-keygen
평소대로.
MyFW 역할을 하는 머신 B에 사용자 "터널"을 추가합니다. 다음 명령은 sudo를 사용하여 다른 사용자가 실행합니다.
useradd tunnel -m -d /home/tunnel -s /bin/true
터널 사용자에게는 비밀번호가 없습니다. 위의 명령으로는 홈 디렉토리를 만들지 않았습니다.
mkdir /home/tunnel/.ssh
사용자 터널용 SSH 키를 생성하여 /home/tunnel
디렉터리에 배치했습니다.
ssh-keygen
원격 시스템 A의 공개 키를 MyFW 시스템 B의 /home/tunnel/.ssh/authorized_keys 파일에 수동으로 복사했습니다.
SSH 구성 파일에 값을 설정했습니다.
AllowTcpForwarding Yes
GatewayPorts yes
ExitOnForwardFailure=yes
이것의 목적은 방화벽에 사용자를 생성하여 해커의 액세스 시도를 차단하면서 터널을 생성하고 연결하는 것입니다. 실제 원격 시스템 A에는 아무런 가치가 없으므로 해커가 이를 손상시키더라도 별 문제가 되지 않습니다.
시험
테스트하기 위해 원격 시스템 A에 로컬 터널을 설정한 다음 시스템 A에서 MyFW로 SSH를 시도했습니다.
이는 일반 "사용자"에게 적용됩니다.
$ ssh -L 9022:localhost:222 [email protected]
$ ssh localhost -p 9022
예상대로 첫 번째 명령은 터널을 생성합니다. 두 번째 명령은 SSH 터널을 통해 다른 컴퓨터의 CLI에 연결합니다.
그러나 이는 제한된 "터널"에서는 작동하지 않습니다.
$ ssh -L 9222:localhost:222 [email protected]
$ ssh localhost -p 9222
CLI는 연결이 닫혔다고 보고합니다. 문제가 무엇인지 보여주는 시스템 로그에서 아무것도 볼 수 없습니다.
터널링된 사용자에게 셸이 없는 경우 터널링된 SSH가 작동할 것으로 예상해야 합니까? 이 글을 쓰면서 어쩌면 아닐지도 모른다는 생각이 듭니다. 터널을 어떻게 테스트하나요?
질문
내가 뭘 잘못했나요? ?
누군가 이것을 시도해 보고 작업 지침이나 버그를 게시해 줄 수 있습니까?
제한된 사용자로 터널을 테스트하는 방법은 무엇입니까?
편집하다
사용자 터널 계정은 비밀번호 없이 생성됩니다. 터널 계정이 잠겨 있는 것으로 보고되므로 SSH를 사용할 때 문제가 발생합니다.
비밀번호 해킹(비밀번호가 없으면 해독할 수 없음)을 막기 위해 비밀번호 없이 계정을 만드는 것은 좋지 않은 생각이며 보안을 약화시키는 것 같습니다.
답변1
-N
터널 전용 연결을 설정하는 데 사용됩니다.
ssh -N -L 9222:localhost:222 [email protected] &
답변2
구성 파일 등을 변경하지 않고 다음 명령 순서를 시도했습니다. 이러한 명령은 시뮬레이션된 원격 컴퓨터에서 시뮬레이션된 로컬 방화벽 컴퓨터로 터널을 구축합니다. 터널 항목은 원격 컴퓨터의 포트 9222입니다.
원격 컴퓨터의 터미널에서:
$ ssh -L 9222:localhost:22 -N [email protected]
IP 172.30.21.157에서 방화벽에 대한 터널을 설정합니다. -N 옵션이 포함되지 않으면 연결이 자동으로 종료됩니다. 터널 사용자는 방화벽에만 존재하며 비밀번호가 없습니다. 터널 사용자가 원격 컴퓨터에 존재하지 않습니다. 방화벽이 터널 사용자에 대한 연결을 허용하도록 SSH 키가 미리 교환됩니다. 터널을 구축하는 데 사용된 ssh 명령은 포그라운드에 남아 있습니다(테스트용으로만). 위의 명령을 입력한 후에는 프롬프트가 나타나지 않습니다. cntl-C
프롬프트는 터널이 닫혀 있고 "이것은 예상된 동작입니다."인 경우 에만 나타납니다.
원격 시스템을 방화벽 CLI에 연결하기 위해 원격 시스템의 다른 터미널에서 다음 명령을 실행했습니다.
$ sudo ssh -p 9222 fwuser@localhost
원격 시스템에서 이 명령은 로컬 호스트(원격 시스템)의 포트 9222에서 방화벽 시스템의 fwuser 계정에 대한 SSH 연결을 설정합니다. 이것이 질문에 표시된 내 명령의 근본 원인 문제입니다. 실패한 명령에 올바른 사용자(fwuser)를 지정하지 않았습니다.
ssh는 명령이 입력된 동일한 시스템에서 연결을 설정하고 있다고 생각합니다. 실제로 포트 9222에 대한 연결을 설정하고 이를 fwuser로 로그인한 터널의 다른 쪽 끝으로 터널링합니다. 원격 컴퓨터에서 터미널을 실행하고 있는데 방화벽이 있는 컴퓨터에서 메시지가 나타납니다.
터널이 건설되면 터널 사용자는 터널을 통과하는 트래픽을 효과적으로 볼 수 없습니다.
요약하면, 셸 액세스 없이 제한된 사용자를 사용하는 것은 터널을 구축할 때 다른 사용자와 마찬가지로 작동합니다. SSH 키를 교환하려면 더 많은 노력이 필요합니다. -N 옵션은 터널을 구축하는 명령에서 매우 중요합니다.