암호화된 통신

OpenSSH의 가장 핵심적인 기능 중 하나는 암호화된 통신을 제공하는 것이다. 이를 통해 네트워크 상에서 전송되는 모든 데이터를 안전하게 보호할 수 있으며, 이로 인해 중간에 데이터가 가로채지더라도 해독할 수 없다. SSH는 다양한 암호화 알고리즘을 사용하여 세션 데이터를 보호하며, 그 중 가장 대표적인 알고리즘으로는 AES (Advanced Encryption Standard), Blowfish, 3DES 등이 있다.

암호화는 대칭키 암호화 방식을 사용하는데, 이는 클라이언트와 서버가 동일한 키를 공유하여 데이터를 암호화하고 복호화하는 방식이다. 이러한 방식의 장점은 빠르다는 점이지만, 키 교환 방식에서 문제가 발생할 수 있다. 이를 보완하기 위해 SSH에서는 Diffie-Hellman 키 교환 방식을 사용하여 안전한 키 교환을 보장한다.

인증 기능

OpenSSH는 다양한 인증 방법을 지원하며, 이는 SSH 프로토콜의 또 다른 중요한 기능이다. 기본적으로 OpenSSH는 비밀번호 기반 인증과 공개키 기반 인증을 제공하지만, 그 외에도 Kerberos, GSSAPI, 인증서 기반 인증 등 고급 인증 방법을 지원한다.

공개키 기반 인증은 비밀번호 기반 인증보다 훨씬 안전한 방법이다. 이를 수식으로 표현하면, 사용자가 소유한 개인키 \mathbf{K_{private}}와 서버에 등록된 공개키 \mathbf{K_{public}}가 서로 쌍을 이루며, 다음과 같은 관계가 성립한다.

\mathbf{E_{public}}(M) = C \quad \text{and} \quad \mathbf{D_{private}}(C) = M

여기서 \mathbf{E_{public}}는 공개키를 이용한 암호화, \mathbf{D_{private}}는 개인키를 이용한 복호화 과정을 의미하며, M은 원문 메시지, C는 암호화된 메시지이다.

포트 포워딩 기능

포트 포워딩은 SSH의 또 다른 중요한 기능으로, 네트워크의 다른 서버나 클라이언트와의 연결을 중계하는 역할을 한다. 이는 로컬 포트 포워딩, 원격 포트 포워딩, 그리고 동적 포트 포워딩으로 구분된다.

이러한 포트 포워딩 기능을 활용하면, 일반적으로 접근이 제한된 서버나 네트워크에 안전하게 접근할 수 있게 되며, 특히 방화벽 뒤에 있는 서버와의 통신에 유용하다.

터널링 기능

OpenSSH의 터널링(Tunneling) 기능은 클라이언트와 서버 간에 안전한 통신 채널을 생성하여 데이터를 보호하는 또 하나의 강력한 기능이다. 이 기능은 보안 터널을 통해 네트워크 트래픽을 전송하여 외부 네트워크의 공격자로부터 데이터를 보호할 수 있다.

SSH 터널링은 특히 보안이 취약한 공용 네트워크에서 민감한 데이터를 보호하기 위해 사용된다. 로컬 네트워크 내에 있는 다른 서버나 서비스에 접속할 때, SSH 터널을 이용하면 데이터가 암호화된 상태로 전송되므로 중간에서 데이터가 유출될 위험이 줄어든다.

터널링에는 로컬, 원격, 동적 포트 포워딩이 포함되며, 이는 앞서 설명한 포트 포워딩 방식과 결합되어 네트워크 보안을 강화하는 데 중요한 역할을 한다.

X11 포워딩

OpenSSH는 원격 서버의 GUI 애플리케이션을 로컬 클라이언트에서 실행할 수 있게 해주는 X11 포워딩 기능을 제공한다. 이는 주로 유닉스 기반 시스템에서 사용되며, 사용자가 원격 서버의 X 윈도우 애플리케이션을 로컬에서 사용할 수 있도록 돕는다.

이를 활성화하기 위해서는 SSH 클라이언트와 서버에서 X11 포워딩을 설정해야 한다. SSH 설정 파일에서 다음과 같이 구성할 수 있다.

X11Forwarding yes
X11DisplayOffset 10

X11 포워딩은 원격 서버에서 그래픽 환경을 필요로 하는 작업을 수행할 때 유용하지만, 보안상 주의가 필요하다. 이를 통해 공격자가 악의적인 목적으로 서버에 접근할 가능성이 있기 때문에 사용 시 반드시 안전한 환경에서 적용해야 한다.

SOCKS 프록시 기능

OpenSSH는 SOCKS5 프록시 기능을 통해 다양한 클라이언트와 서버 간의 통신을 지원한다. SOCKS 프록시는 SSH를 통해 외부 네트워크로의 모든 트래픽을 중계하며, 이 과정에서 데이터를 암호화하여 보안을 강화한다.

SOCKS 프록시를 설정하는 방법은 간단하다. SSH 클라이언트에서 -D 옵션을 사용하여 SOCKS 프록시 포트를 지정할 수 있다. 예를 들어, 다음과 같이 프록시를 설정할 수 있다.

ssh -D 1080 user@server

위 명령은 클라이언트 측에서 포트 1080을 열고, 그 포트를 통해 원격 서버와의 연결을 암호화하여 중계한다. 이를 통해 다양한 네트워크 애플리케이션에서 OpenSSH를 프록시로 사용할 수 있다.

파일 전송 기능

OpenSSH는 안전한 파일 전송을 위한 두 가지 주요 기능을 제공한다: SCP(Secure Copy)SFTP(Secure File Transfer Protocol). 이 기능들은 네트워크 상에서 안전하게 파일을 전송하기 위한 방법으로, 전송되는 파일 데이터를 암호화하여 제3자가 데이터를 중간에서 가로챌 수 없게 한다.

SCP (Secure Copy)

SCP는 SSH 프로토콜을 사용하여 원격 서버와 로컬 컴퓨터 간에 파일을 안전하게 복사할 수 있는 기능이다. SCP는 간단한 명령어 인터페이스를 제공하며, 이를 사용하면 다음과 같이 파일을 전송할 수 있다.

scp localfile user@server:/path/to/remote/

이 명령어는 로컬 파일을 원격 서버의 지정된 경로로 복사한다. 반대로 원격 서버에서 로컬로 파일을 복사하려면 다음과 같이 사용할 수 있다.

scp user@server:/path/to/remotefile localpath/

SCP는 직관적이고 빠른 파일 전송 방법을 제공하지만, 파일 전송 도중 중단되면 재개할 수 없다는 단점이 있다. 이런 상황에서 더 유연한 대안으로 SFTP를 사용할 수 있다.

SFTP (Secure File Transfer Protocol)

SFTP는 SSH 프로토콜 위에서 작동하는 파일 전송 프로토콜로, FTP와 유사한 인터페이스를 제공하지만 전송되는 데이터가 암호화된다는 점에서 차별화된다. SFTP는 파일의 전송, 삭제, 이름 변경, 디렉터리 탐색 등의 작업을 지원하며, 네트워크 중단 시 파일 전송을 재개할 수 있는 기능을 제공한다.

SFTP를 사용하려면 SSH를 통해 서버에 접속한 후 SFTP 세션을 시작할 수 있다.

sftp user@server

이후 SFTP 세션 내에서 다음과 같은 명령을 사용할 수 있다.

SFTP는 SCP보다 더 다양한 기능을 제공하며, 주로 안정적이고 대용량 파일을 전송할 때 유용하다.

공개키 기반 인증

OpenSSH는 공개키 기반 인증을 통해 비밀번호 없이 안전하게 서버에 접속할 수 있다. 이 방법은 개인키와 공개키의 쌍을 사용하는 방식으로, 사용자는 개인키를 로컬 컴퓨터에 저장하고, 서버에는 공개키를 등록하여 비밀번호 없이 서버에 접속할 수 있다.

  1. 먼저 SSH 키 쌍을 생성한다.
ssh-keygen -t rsa

이 명령어를 사용하면 RSA 알고리즘을 기반으로 개인키와 공개키가 생성된다. 기본적으로 키는 ~/.ssh 디렉토리에 저장되며, 개인키는 id_rsa, 공개키는 id_rsa.pub라는 파일 이름으로 저장된다.

  1. 공개키를 서버에 등록한다.
ssh-copy-id user@server

위 명령어를 사용하면 로컬 컴퓨터의 공개키를 원격 서버에 복사하여 등록할 수 있다. 등록이 완료되면, 이후 서버 접속 시 비밀번호 입력 없이 개인키를 통해 인증이 이루어진다.

공개키 기반 인증의 장점은 비밀번호를 입력할 필요가 없다는 점 외에도, 비밀번호 기반 인증보다 훨씬 안전하다는 것이다. 비밀번호는 중간에서 탈취당할 가능성이 있는 반면, 개인키와 공개키를 사용하는 인증 방식은 중간 공격을 방지할 수 있다.

멀티팩터 인증

OpenSSH는 멀티팩터 인증(MFA, Multi-Factor Authentication)을 통해 보안성을 강화할 수 있다. 멀티팩터 인증은 사용자가 서버에 접속할 때 두 가지 이상의 인증 방법을 요구하는 방식으로, 일반적으로 비밀번호 또는 공개키 인증과 함께 추가적인 인증 방법을 결합하여 보안을 강화한다. 예를 들어, 비밀번호 인증 후에 OTP(One-Time Password)를 사용하는 방식이 일반적이다.

  1. TOTP(Time-based One-Time Password) 기반 인증 설정:

OpenSSH는 Google Authenticator와 같은 TOTP 기반 앱을 통해 멀티팩터 인증을 구현할 수 있다. 이를 설정하기 위해서는 서버에 PAM(Pluggable Authentication Modules)을 설정하고 pam_google_authenticator.so 모듈을 활성화해야 한다.

PAM 설정 파일(/etc/pam.d/sshd)에 다음 내용을 추가하여 Google Authenticator 모듈을 활성화할 수 있다.

auth required pam_google_authenticator.so

이후 사용자는 Google Authenticator 앱에서 생성된 OTP를 SSH 접속 시 입력하여 인증할 수 있다.

  1. U2F(FIDO Universal 2nd Factor) 기반 인증 설정:

U2F는 보안키(예: YubiKey)를 이용한 물리적 인증 방법으로, 이를 통해 사용자는 비밀번호나 공개키 인증에 추가하여 보안키를 사용해 더 높은 보안을 제공받을 수 있다. U2F 보안키는 SSH에서 인증서 기반 인증과 함께 사용할 수 있으며, 서버 설정에 따라 SSH 접속 시 U2F 키를 요구하도록 설정할 수 있다.

멀티팩터 인증을 사용하면 사용자가 비밀번호나 공개키만으로 접속하는 것보다 훨씬 안전하게 서버를 보호할 수 있다. 특히, 공격자가 비밀번호를 탈취하더라도 추가적인 인증 방법이 필요하기 때문에 보안성을 크게 향상시킬 수 있다.

포트 포워딩

포트 포워딩은 OpenSSH에서 자주 사용되는 기능 중 하나로, 클라이언트와 서버 간에 안전한 터널을 형성하여 특정 네트워크 트래픽을 전달할 수 있다. 이를 통해 사용자는 로컬, 원격, 동적 포트 포워딩을 설정하여 네트워크 보안을 강화할 수 있다.

  1. 로컬 포트 포워딩:

로컬 포트 포워딩은 클라이언트의 로컬 포트를 통해 원격 서버와의 연결을 중계하는 방식이다. 예를 들어, 로컬 머신에서 8080 포트를 사용하여 원격 서버의 80번 포트로 연결을 중계하려면 다음 명령을 사용할 수 있다.

ssh -L 8080:localhost:80 user@server

이 명령은 로컬의 8080번 포트를 통해 원격 서버의 웹서버(포트 80)로 요청을 전송한다. 로컬 포트 포워딩은 내부 네트워크 리소스에 안전하게 접근할 수 있게 해주며, 방화벽을 통과하여 외부 네트워크 리소스에 접근할 때도 유용하다.

  1. 원격 포트 포워딩:

원격 포트 포워딩은 반대로, 원격 서버에서 특정 포트를 로컬 클라이언트로 전달하는 방식이다. 이를 통해 원격 서버에서 로컬 머신의 자원에 접근할 수 있다.

ssh -R 8080:localhost:80 user@server

이 명령은 원격 서버의 8080번 포트를 로컬 클라이언트의 80번 포트로 연결한다. 주로 원격 서버에서 로컬 네트워크에 있는 자원에 접근할 때 사용된다.

  1. 동적 포트 포워딩:

동적 포트 포워딩은 SOCKS 프록시와 유사하게 다양한 목적지의 포트로 트래픽을 전송할 수 있다. 클라이언트는 SSH를 통해 외부 네트워크로의 모든 트래픽을 프록시처럼 보낼 수 있으며, 이를 통해 네트워크 보안과 익명성을 강화할 수 있다.

ssh -D 1080 user@server

이 명령은 로컬 머신의 1080번 포트에서 SSH 터널을 통해 원격 서버로 트래픽을 보낸다. 다양한 애플리케이션에서 이 포트를 SOCKS 프록시로 설정하여 사용할 수 있다.

SSH 에이전트와 에이전트 포워딩

OpenSSH는 SSH 에이전트(ssh-agent)를 통해 사용자가 여러 SSH 서버에 접속할 때 비밀번호나 개인키 암호를 반복적으로 입력하지 않아도 되는 편리한 인증 방법을 제공한다. SSH 에이전트는 로컬 머신에서 SSH 개인키를 메모리에 저장하고, SSH 클라이언트가 서버에 접속할 때 해당 키를 사용해 인증을 수행할 수 있도록 지원한다.

SSH 에이전트의 역할

SSH 에이전트는 SSH 키 기반 인증을 자동화하는 역할을 한다. 이를 통해 사용자는 개인키에 암호를 설정해도 매번 암호를 입력할 필요 없이, SSH 에이전트에 한 번만 암호를 입력하면 나중에 SSH 서버에 접속할 때 자동으로 인증을 수행할 수 있다.

  1. SSH 에이전트 시작:

대부분의 리눅스 배포판에서는 기본적으로 SSH 에이전트가 시작되지만, 수동으로 시작할 수도 있다.

eval "$(ssh-agent -s)"

위 명령은 SSH 에이전트를 백그라운드에서 실행시키고, 필요한 환경 변수를 설정한다.

  1. SSH 키 에이전트에 추가:

에이전트를 실행한 후, 사용자는 개인키를 에이전트에 추가하여 사용할 수 있다.

ssh-add ~/.ssh/id_rsa

위 명령은 id_rsa 개인키를 에이전트에 추가하여, SSH 서버 접속 시 이 키를 자동으로 사용할 수 있도록 한다.

에이전트 포워딩

SSH 에이전트 포워딩은 사용자가 한 SSH 서버에서 다른 SSH 서버로 접속할 때도 에이전트의 인증 정보를 사용할 수 있도록 하는 기능이다. 이 기능을 사용하면, 사용자가 중간 서버를 거쳐 최종 서버로 접속할 때 개인키를 복사하거나 재인증할 필요 없이 한 번의 인증으로 여러 서버에 연결할 수 있다.

  1. SSH 에이전트 포워딩 설정:

에이전트 포워딩을 사용하려면 SSH 클라이언트에서 -A 옵션을 사용하여 에이전트 포워딩을 활성화할 수 있다.

ssh -A user@intermediate_server

이 명령을 사용하면 중간 서버에 접속한 후, 그 서버에서 다시 최종 서버로 SSH 접속할 때도 에이전트에 저장된 인증 정보가 사용된다.

  1. SSH 구성 파일에서 에이전트 포워딩 활성화:

에이전트 포워딩을 SSH 클라이언트 설정 파일인 ~/.ssh/config에서 자동으로 활성화할 수도 있다.

Host * ForwardAgent yes

위와 같이 설정하면, 모든 SSH 접속에서 자동으로 에이전트 포워딩이 활성화된다. 특정 호스트에만 적용하고 싶다면 Host * 대신 호스트명을 명시하면 된다.

에이전트 포워딩은 원격 서버에 접속할 때 개인키 파일을 복사하거나 여러 번 인증을 요구하지 않아 편리하지만, 보안상 위험 요소가 될 수 있다. 특히, 중간 서버가 신뢰할 수 없거나 공격에 노출된 경우, 에이전트 포워딩을 통한 인증 정보가 유출될 위험이 있으므로, 반드시 신뢰할 수 있는 서버에서만 사용해야 한다.

암호화 알고리즘 및 보안 레이어

OpenSSH는 통신 과정에서 데이터를 보호하기 위해 다양한 암호화 알고리즘을 지원한다. SSH는 세션 데이터와 인증 정보를 암호화하기 위해 주로 대칭키 알고리즘을 사용하며, 이러한 알고리즘들은 보안성과 성능 면에서 중요한 역할을 한다.

  1. 대칭키 암호화 알고리즘:

OpenSSH에서 주로 사용되는 대칭키 암호화 알고리즘으로는 AES, 3DES, Blowfish 등이 있다. 이러한 알고리즘들은 빠르게 데이터를 암호화하고 복호화할 수 있으며, 네트워크 성능을 크게 저하시키지 않으면서도 높은 수준의 보안을 제공한다.

SSH는 세션 키 교환 및 인증 과정에서 비대칭키 암호화 알고리즘을 사용한다. 대표적인 비대칭키 암호화 알고리즘으로는 RSA, DSA, ECDSA 등이 있으며, 주로 공개키와 개인키 쌍을 사용하여 데이터를 보호한다.

OpenSSH는 메시지의 무결성을 보장하기 위해 메시지 인증 코드(MAC, Message Authentication Code)를 사용한다. MAC는 데이터를 암호화하는 과정에서 데이터가 변조되지 않았음을 확인하는 방법으로, 주로 HMAC-SHA2, HMAC-MD5와 같은 해시 함수를 사용한다.

SSH는 이러한 다양한 암호화 알고리즘을 결합하여 통신 과정에서 데이터를 안전하게 보호하며, 사용자와 서버 간의 신뢰성을 보장한다.