요새 서버 : TCP 전달 사용 vs 서버에 개인 키 배치


10

요새 서버 B가 있습니다. 개인 키를 사용하여 A에서 B로 C로 SSH해야합니다.

더 나은 옵션은 무엇입니까?

  • 개인 SSH 키를 서버 B 에 넣습니다 . 프로덕션 환경 에서는 개인 SSH 키를 사용 하는 것이 좋지 않습니다.

    에서 여기 :

    배스 천 인스턴스에 SSH 개인 키를 두지 마십시오. 대신 SSH 에이전트 전달을 사용하여 먼저 요새와 개인 서브넷의 다른 인스턴스에 연결하십시오. 이를 통해 SSH 개인 키를 컴퓨터에 보관할 수 있습니다.

  • SSH 에이전트 전달을 사용하십시오 . 에이전트 전달을 설정하려면 TCP 전달을 허용해야합니다. 에이전트 전달을 설정하면 전달 호스트에 소켓 파일이 작성되는데, 이는 키를 대상으로 전달할 수있는 메커니즘입니다. AWS의 요새 설정에서 :

    TCP 전달 :이 값을 true로 설정하면 TCP 전달 (SSH 터널링)이 활성화됩니다. 이 기능은 매우 유용 할 수 있지만 보안 위험이 있으므로 필요하지 않은 경우 기본 (비활성화) 설정을 유지하는 것이 좋습니다.

    또한 여기에서 :

    유해한 것으로 간주되는 SSH 에이전트 전달

더 나은 게 뭐야? 두 번째 링크의 대안은 어떻습니까? ProxyCommand , 소켓 파일 문제에 도움이 된다는 것을 이해하지만 여전히 TCP 전달을 활성화해야한다고 생각하므로 충분히 안전합니까?


2
ProxyCommand를 사용하면 TCP 전달을 활성화 할 필요가 없습니다. 전달은 중간 호스트에서 ssh에 의해 수행됩니다.
— wurtel

감사. 구성 파일이 있어야합니까? 내 컴퓨터 나 요새에서?
— user2503775

로컬 시스템에서 ssh hostb명령을 입력 하면 로컬 구성에서 hostb를 조회하고 hosta를 통해 연결해야 함을 알 수 있습니다. 만약 당신이 설정을 hosta에 놓으면 그렇게 할 수 없었습니다.
— wurtel

서버 C의 개인 키는 어디에 저장됩니까? 내 광고에도? keeAgent와 함께 keepass를 사용하고 있습니다.
— user2503775

2
TCP 전달 과 에이전트 전달을 혼동하는 것이 두렵습니다 . 그들은 다른 것입니다.
— MLu

답변:


13

ProxyCommand 또는 ProxyJump 사용

사용하는 것이 좋습니다 ProxyCommand(또는 ProxyJump구문이 더 쉬우지만 클라이언트 측에서 openssh 7.3 이상이 필요하므로 더 좋습니다 ). Bastion에 개인 키를 배포 할 필요가 없으며 모든 것이 로컬에 유지됩니다.

ProxyJump를 사용한 예

클라이언트 컴퓨터에서 다음 ~/.ssh/config과 유사한 내용으로 파일을 작성합니다 .

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

그러면 ssh srvC에이전트 전달없이 B (bastion)를 통해 C에 연결하거나 개인 키를 요새에 배포 할 수 있습니다.

위의 예에서 "bastion"은 Bastion 호스트의 별칭이고 srvC는 서버 C의 별칭 HostName입니다. 호스트의 IP 또는 실제 정규화 된 도메인 이름을 입력해야합니다. 사용자의 User경우 Bastion 및 서버 C에서 올바른 로그인 이름 을 업데이트해야 합니다. 마지막으로 IdentityFile로컬 에이전트 (예 : KeeAgent 또는 ssh-agent)를 사용하는 경우 선택 사항이지만 실행되지 않는 경우에는 선택 사항입니다. 각 주요 암호 문구를 요구하십시오.

공개 키 배포

물론 공개 키를 요새와 srvC 모두 에 배포해야합니다 . 사용할 수 있습니다 ($ 기호는 프롬프트를 나타 내기위한 것이며 입력하지 마십시오).

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

참고 : 위의 비밀번호 인증이 여전히 허용 된 경우에만 작동합니다. 위의 배포 및 모든 것이 의도 한대로 작동하는지 확인한 후 두 서버에서 비밀번호 인증을 허용하지 않아야합니다.

ProxyJump 대신 ProxyCommand를 사용한 예

ProxyJump(클라이언트 측에서) 지원하지 않는 이전 버전의 OpenSSH가있는 경우 다음을 교체하십시오.

ProxyJump bastion

으로

ProxyCommand ssh -q -W %h:%p bastion

내가 이해하는 한 이것은 비슷합니다.


감사합니다! 나는 리눅스로 일하지만 우리는 일부 팀원이 창문에서 일하고 있습니다. 그것은 또한 거기에서 작동해야합니까?
— user2503775

어떤 SSH 클라이언트를 사용할 예정입니까? MobaXterm과 같은 OpenSSH (WSL 또는 cygwin 등) 또는 PuTTY (또는 PuTTY 기반의 다른 도구)?
— Huygens

그들 중 일부는 PuTTy를 사용하고 다른 일부는 Git Shell을 통해 ssh를 사용합니다.
— user2503775

@ user2503775 PuTTY로 시도한 적이 없지만 ProxyCommand 접근 방식을 사용하는 것이 가능합니다. stackoverflow.com/a/28937185
— Huygens

1
자세한 답변을 주셔서 대단히 감사합니다!
— user2503775

5

ProxyJump에 대한 답변을 보았습니다. ProxyCommand 에 대해 이야기합시다 .

그러나 기다려라! 에이전트 전달을 사용 하는 서버를 해킹하는 방법을 알려 주면 차이점을 이해하기가 훨씬 쉬워집니다!

해킹하자!

기본 단계 : 여기 내 게시물을 읽을 수 있습니다

기본 단계는 다음과 같습니다.

  1. 요새 사용자 만들기
  2. 루트 로그인 비활성화
  3. 해킹 시도 차단
  4. 포트 변경
  5. 방화벽 구성
  6. SELinux 구성

AgentForwarding 사용 방법

~ / .ssh / config에서 구성 만들기

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

ssh-agent에 인증 키 추가

ssh-add ~/.ssh/name_rsa

요새 호스에 연결

ssh bast

요새에서 응용 프로그램 서버 연결

 ssh app@IP -p PORT

해킹!

당신은 나에게 질문을 할 수 있습니다.

  • 내 서버는 안전합니까? 대답은 매우 간단합니다.

    • 아니!
  • 왜?

    • SSH 에이전트 전달을 사용하고 있기 때문에!
  • 그리고 문제는 어디에 있습니까?

    • 에이전트 전달은 위험하며 유해한 것으로 간주됩니다.
  • 왜?

    • 요새 호스트를 연결하면 영광스러운 ssh-agent가 전달됩니다. 이는 누군가가이 소켓 데이터를 사용하여 서버에 액세스 할 수 있도록 소켓이 설정됨을 의미합니다. 요새 서버가 손상되었다고 상상해보십시오. 누군가 Linux 서버에 대한 충분한 권한이 있으면 소켓 정보 만 사용합니다. 결과적으로 모든 서버에 액세스 할 수 있습니다. 요새 호스트에 얼마나 많은 시간이 연결되어 있는지에 따라 타협 창이 매우 작다는 것을 알고 있습니다. 그러나 ProxyCommand와 같은 다른 옵션이있을 때 실제로 위험에 처하고 싶습니까? 따라서 ProxyCommand를 사용하십시오!

요새 호스트가 손상된 경우 서버를 해킹하는 방법은 무엇입니까?

대상 추적

/ tmp 디렉토리에는 다음과 같은 내용이 표시 될 수 있습니다.

[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

임시 파일을 열어 봅시다

[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

이 프로세스 ID에 대한 연결 을 보자 .

netstat -nxp | grep  10507

결과:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

과 사람을 연결되어 있습니까?

lsof -i -a -p 10507

결과:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

소켓 파일도 볼 수 있습니다 :

cd /proc/10507/fd/
ls

결과:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

그리고 무슨 일이 클라이언트 때 연결됩니다 원격 서버에? 보자 :

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

netstat를 사용하여 소켓 파일이 사용되는지 확인할 수도 있습니다.

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

소켓 정보 및 IP 주소 도용

이제 요새 호스트 세션이 열려있는 동안 소켓 정보를 훔쳐 야합니다 . 또한 대상 서버 IP 도 필요 하므로 netstat를 사용하십시오.

netstat -tn

마지막 단계 사용하는 전달 된 소켓 파일을

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

키가로드되어 있는지 확인하십시오 .

ssh-add -l

결과는 다음 과 같아야합니다 .

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

서버가 해킹당했습니다. 보안 문제를 해결하는 방법은 무엇입니까?

프록시 명령

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

기본 작업 : 서버를 통해 파일을 전송하는 방법 (클라이언트에서 서버로, 서버에서 클라이언트로), 내 게시물을 읽을 수 있습니다.

결론

  • 요새 호스트를 사용하는 경우 AgentForwarding을 사용하지 말고 ProxyCommand를 사용하십시오.
  • 인증을 위해 항상 루트가 아닌 사용자를 사용하십시오.
  • 방화벽을 사용하고 불필요한 모든 연결을 차단하십시오.
  • SELinux 사용 (일반)
  • 잘못된 자격 증명으로 여러 번 로그인을 시도하는 IP 주소 차단
  • 필요하지 않은 경우 사용자에게 sudo 권한을 부여하지 마십시오
  • 서버 모니터링
  • 보안 패치를 위해 서버 업데이트

자세한 내용은 내 블로그를 참조하십시오 . 또한 나는 약간의 screeenshots를 가지고 있으므로 도움이 될 수 있습니다.


대단히 감사합니다! 실제로 로그인시 Google 인증 자도 사용합니다.
— user2503775

ssh app :을 호출하려고 할 때 오류가 발생 channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed. 합니다. 왜 그런지 알아? 보안 로그에 다음이 표시됩니다.refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
— user2503775

멋진 정보. 답의 가독성을 향상시키는 작은 조언. 블로그 내용을 여기에 복사 / 붙여 넣기하지 마십시오. 링크와 요약 만 제공하십시오. 그런 다음 실제 응답 부분 (ProxyCommand를 사용하는 부분)을 강조 표시하십시오. 나는 당신이 처음에 그것을 시도하는 것을 보았지만 복사 / 붙여 넣기 부분이 다소 혼란 스러웠습니다. 어쨌든 +1
— Huygens

@ user2503775 ssh-agent 전달 / 프록시 명령과 관련이없는 다른 문제 여야합니다. 로그로 새로운 질문을 열어 봅시다.
— grep


4

다른 에이전트 와 마찬가지로 SSH 에이전트 전달을 사용하십시오 .

  • 키는 랩톱의 ssh 에이전트 에 있습니다.
  • 에이전트를 통해 인증 된 요새에 로그인합니다.
  • 거기에서 인증 요청이 노트북으로 다시 전달 되어 대상 호스트에 로그인합니다 .

장점 : 오용 할 수있는 요새에 키가 저장되어 있지 않습니다.

희망이 있습니다 :)


안녕하세요, 기본적으로 OP가 두 번째 글 머리표에 설명되어 있습니다. 질문에 제공된 두 번째 링크를 확인하는 것이 좋습니다.
— Huygens

@Huygens 사실 나는 지금 알았습니다. TCP 포워딩과 에이전트 포워딩을 혼합 할 때 나는 오버록했다.
— MLu

실제로 이것은 섞여있다 :-)
— Huygens

혼합되지 않았습니다. 차이점을 이해합니다. 명확하게하기 위해 질문을 편집했습니다.
— user2503775

에이전트 전달을 해킹하는 방법에 대한 답변을 썼습니다 (키는 없지만 소켓이 열려 있습니다). 일반적으로 에이전트 전달은 키를 도용 할 가능성이 매우 낮기 때문에 괜찮습니다. 우선 요새 요새를 해킹해야합니다. 어쨌든 내 대답을 볼 수 있습니다 : serverfault.com/a/958466/476642
— grep
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.