호스팅 제공업체에 관계없이 범용 솔루션이 필요하지만 AWS에서 VPS를 실행하고 있습니다.
이 VPS는 SSH를 통해 다양한 다른 상자에 액세스(역방향 SSH를 통해 점프 상자에 연결)하는 등 다양한 내부 서버에 대한 점프 상자(CentOS 6 실행) 역할을 합니다. Jump Box는 각 서비스에 대해 임의의 상위 포트를 노출합니다.
현재 SSH를 통해 Jump Box에 연결된 IP 주소에만 이러한 상위 포트를 노출할 수 있습니까?
출력을 스캔하여 who -a
IP 주소를 필터링하고 IPTABLES
cronjob을 사용하여 업데이트하거나 API를 사용하여 AWS의 보안 그룹을 업데이트하는 것을 고려하고 있습니다. 그러나 이런 접근 방식은 조잡해 보인다. 어떤 제안이 있으십니까?
답변1
SSH 연결을 시작할 때 대상/포트를 알고 있는 경우
ssh -L 8080:10.0.0.1:80 <JumpBox address>
이상적으로는 현재 보고 있는 위치와 유사한 것을 사용하여 JumpBox에 연결하는 것이 좋습니다.10.0.0.1 방화벽/NAT 뒤에 있지만 JumpBox를 통해 액세스할 수 있습니다..
이렇게 하면 연결이 생성되고 127.0.0.1(localhost)에 바인딩되므로 브라우저(아니면 다른 소프트웨어) 클라이언트에서 연결하고http://localhost:8080귀하의 패킷은 다음 주소로 라우팅됩니다.10.0.0.1:80이는 JumpBox 자체에서 직접 액세스하는 것과 같습니다.
[ssh] 접속시 포트번호/대상을 알 수 없는 경우
SOCKS/SOCKS5 프록시를 사용하도록 구성된 클라이언트를 사용하면 연결된 클라이언트에 서버에 액세스할 수 있는 모든 리소스에 대한 액세스 권한을 제공할 수 있다는 점에 유의하는 것이 중요합니다.
"동적 전달"을 사용하여 VPS에 연결
ssh -D 1080 <JumpBox address>
- SOCKS 프록시 서버를 사용하도록 클라이언트 소프트웨어 구성
localhost:1080
- 구성된 소프트웨어를 통해 이루어진 연결은 마치 JumpBox 자체에서 대상에 연결하는 것처럼 터널링됩니다.
답변2
다음을 사용하여 설명된 시스템을 구축할 수 있습니다.iptables,IP 세트그리고pam_exec.
아이디어는 다음과 같습니다. 들어오는 트래픽이 더 높은 포트에 도달하도록 허용하는 규칙을 갖춘 별도의 체인을 갖습니다. iptables INPUT 체인에는IP 세트로그인한 호스트와 일치하는 규칙은 별도의 체인으로 이동합니다. 로그인에 성공한 후 pam_exec는 PAM 세션이 열릴 때 설정된 ipset에 원격 호스트의 IP 주소를 추가하고 PAM 세션이 닫힐 때 이를 제거하는 스크립트를 실행합니다.
IPTABLES 및 IPSET 구성
사용자의 IP 주소에 대한 그룹을 만듭니다. ipset는 영구적이지 않기 때문에 iptable을 복원하기 전에 시작 시 생성되도록 구성해야 합니다.
ipset -N users hash:ip
iptable을 구성합니다. 새 INPUT-users
체인에는 로그인한 사용자에게 트래픽을 허용하는 규칙이 포함됩니다.
iptables -N INPUT-users
소스 주소가 설정되어 있으면 체인 users
으로 점프합니다 .INPUT-users
iptables -A INPUT -m set --match-set users src -j INPUT-users
INPUT-users
체인 에 관련 규칙을 추가합니다 . 이러한 규칙은 소스 주소가 사용자 주소와 일치하는 트래픽에 사용됩니다. 예를 들어 tcp
포트를 허용합니다 16384
.
iptables -A INPUT-users -p tcp --dport 16384
PAM 구성
pam 세션이 열리거나 닫힐 때 실행될 다음 스크립트를 만듭니다. IP 주소는 PAM_RHOST
환경 변수에 설정됩니다.pam_exec
.
/etc/security/pam_exec-session_open
:
#!/bin/sh
ipset --exist --add users "$PAM_RHOST"
/etc/security/pam_exec-session_close
:
#!/bin/sh
ipset --del users "$PAM_RHOST"
그런 다음 SSH 세션에서 이를 사용하도록 pam을 구성하십시오. 에 연결하다 /etc/pam.d/sshd
:
session optional pam_exec.so type=open_session /etc/security/pam_exec-session_open
session optional pam_exec.so type=close_session /etc/security/pam_exec-session_close
덫
사용자에게 여러 SSH 세션이 열려 있는 경우, 그 중 하나를 닫으면 ipset에서 IP 주소가 제거됩니다. 이를 방지하려면 IP 주소가 사용자의 마지막 남은 세션인 경우에만 IP 주소를 삭제하도록 session_close 스크립트에 대한 몇 가지 검사를 작성해야 합니다.
사용자가 NAT 뒤에 연결하는 경우 동일한 NAT 뒤에 연결된 모든 사람은 ipset 규칙(액세스 허용)과 일치합니다.