요새 서버 : 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.