18.10. SSH 터널을 사용하여 TCP/IP 연결 보호

클라이언트와 PostgreSQL 서버 간 네트워크 연결을 암호화하기 위해 SSH를 사용할 수 있다. 제대로 된 경우 이것은 SSL이 불가능한 클라이언트에 대해서도 적절한 네트워크 연결 보호를 제공한다.

먼저 SSH 서버가 PostgreSQL 서버와 동일한 머신에서 올바로 실행 중인지 확인하고 ssh를 사용하여 일부 사용자로 로그인할 수 있는지 확인한다. 그런 다음, 클라이언트 머신에서 아래와 같은 명령을 사용하여 보안 터널을 설정할 수 있다.

ssh -L 63333:localhost:5432 joe@foo.com

-L 의 첫 번째 인수 63333은 터널 종단의 포트 번호이며, 미사용 포트는 무엇이든 가능하다. (IANA는 개인용으로 포트 49152 ~ 65535를 제공한다.) 두 번째 숫자 5432는 터널의 원거리 종단: 서버가 사용 중인 포트 번호이다. 포트 번호 간의 이름 또는 IP 주소는 연결하려는 데이터베이스 서버가 있는 호스트이며, 이 예시에서 foo.com인 로그인되어 있는 호스트에서 표시된다. 이 터널을 사용하여 데이터베이스 서버에 연결하기 위해 사용자는 로컬 머신의 포트 63333에 연결한다.

psql -h localhost -p 63333 postgres

이것은 해당 문맥의 localhost에 연결하는 foo.com 호스트에서 사용자가 정말로 데이터베이스 서버에 대한 joe 사용자인 것처럼 보이게 하고, 이 사용자와 호스트로부터의 연결에 대해 환경 설정된 대로 인증 절차를 사용한다. 사실, SSH 서버와 PostgreSQL 서버 사이가 암호화되지 않으므로 서버는 연결이 SSL로 암호화되어 있지 않다고 생각하게 된다. 동일한 머신에 있는 것이 아니라면 이것은 어떠한 추가적인 보안 위험을 드러내지 않을 것이다.

터널 설정이 성공하려면 사용자가 ssh를 사용하여 터미널 세션을 생성하려고 하는 것처럼 joe@foo.com로써 ssh를 통한 연결이 허용되어야 한다

사용자는 다음과 같이 포트 포워딩을 설정할 수도 있다.

ssh -L 63333:foo.com:5432 joe@foo.com

그러나 데이터베이스 서버가 foo.com 인터페이스에서 들어오는 연결을 보게 되는데, 이것은 기본 설정 listen_addresses = 'localhost'에 의해서는 개방되지 않는다. 보통 이것은 사용자가 원하는 바가 아니다.

일부 로그인 호스트를 통해 데이터베이스 서버에 "hop"해야 한다면 가능한 설정 중 하나는 다음과 같을 것이다.

ssh -L 63333:db.foo.com:5432 joe@shell.foo.com

shell.foo.com에서 db.foo.com으로의 이러한 연결 방법은 SSH 터널에서 암호화되지 않는다는 점에 유의해야 한다. 다양한 방법으로 네트워크가 제한되는 경우에 SSH는 가능한 환경 설정을 다수 제공한다. 자세한 내용은 SSH 문서를 참조 바란다.

작은 정보: 방금 설명한 개념과 유사한 절차를 사용하여 보안 터널을 제공할 수 있는 몇 가지 다른 어플리케이션이 존재한다.