SSH 클라이언트 (ssh)

SSH 클라이언트는 사용자가 원격 서버에 접속하기 위해 사용하는 프로그램이다. 이 프로그램은 사용자가 명령을 입력하면 원격 서버로 전송하고, 서버로부터의 응답을 다시 사용자가 볼 수 있도록 표시해 준다. SSH 클라이언트는 다양한 옵션을 제공하여 사용자 인증, 포트 포워딩, 프록시 사용 등 다양한 기능을 수행할 수 있다. 주요 기능 중 일부는 다음과 같다:

SSH 데몬 (sshd)

SSH 데몬은 SSH 서버 측에서 실행되는 프로그램으로, 클라이언트의 요청을 처리하고, 클라이언트와 서버 간의 안전한 통신을 보장한다. sshd는 서버에서 사용자의 접속 요청을 수신하고, 인증 과정을 거쳐 해당 사용자가 서버에 접속할 수 있도록 허용한다. 주요 역할은 다음과 같다:

SSH 키 관리 도구 (ssh-keygen)

ssh-keygen은 공개키 기반 인증을 위한 키 쌍을 생성하는 도구이다. 이 도구를 사용하면 클라이언트 측에서 개인키와 공개키를 생성하고, 공개키를 서버에 배포함으로써 비밀번호 없이도 안전하게 서버에 접속할 수 있다. ssh-keygen의 주요 기능은 다음과 같다:

SSH 에이전트 (ssh-agent)

ssh-agent는 공개키 기반 인증을 사용하는 경우, 사용자가 매번 개인키의 패스프레이즈를 입력하지 않도록 해주는 프로그램이다. 이 에이전트는 사용자의 개인키를 메모리에 저장해 두고, SSH 클라이언트가 서버에 접속할 때 자동으로 이 개인키를 사용하도록 돕는다.

SSH 설정 파일 (ssh_config, sshd_config)

OpenSSH의 동작은 클라이언트와 서버 각각에서 설정 파일을 통해 제어할 수 있다. 클라이언트의 설정 파일은 ssh_config이며, 서버의 설정 파일은 sshd_config이다. 이 파일들은 각 환경에서 SSH의 동작 방식을 결정하며, 다양한 옵션을 통해 커스터마이징할 수 있다.

클라이언트 설정 파일 (ssh_config)

ssh_config는 클라이언트 측에서 SSH의 동작을 제어하는 파일이다. 주로 사용되는 옵션은 다음과 같다:

서버 설정 파일 (sshd_config)

sshd_config는 서버 측에서 SSH 데몬의 동작을 제어하는 파일로, 보안, 인증 방법, 네트워크 설정 등을 포함한다. 주요 옵션은 다음과 같다:

SCP (Secure Copy Protocol)

SCP는 SSH 프로토콜을 이용하여 안전하게 파일을 복사하는 프로그램이다. SCP는 데이터를 암호화하여 네트워크를 통해 전송하므로, 전송 중에 데이터가 유출되거나 변조되는 것을 방지할 수 있다. 주요 사용 방법은 다음과 같다:

SFTP (Secure File Transfer Protocol)

SFTP는 SSH 프로토콜을 기반으로 한 파일 전송 프로토콜로, SCP와 유사하게 데이터를 암호화하여 안전하게 파일을 전송할 수 있다. SCP와 달리 SFTP는 상호작용적인 파일 전송 인터페이스를 제공하며, 파일 업로드, 다운로드, 디렉토리 탐색, 파일 권한 변경 등 다양한 파일 관리 기능을 지원한다. 주요 기능과 사용 방법은 다음과 같다:

SSH 포트 포워딩

SSH 포트 포워딩은 로컬 시스템과 원격 시스템 간의 네트워크 트래픽을 SSH 프로토콜을 통해 안전하게 전송하는 기능이다. 이를 통해 중간 네트워크를 거치지 않고, 안전한 통신을 설정할 수 있다. SSH 포트 포워딩은 크게 로컬 포트 포워딩, 원격 포트 포워딩, 그리고 동적 포트 포워딩으로 구분된다.

로컬 포트 포워딩

로컬 포트 포워딩은 로컬 시스템의 특정 포트로 들어오는 트래픽을 SSH 터널을 통해 원격 서버로 전송하는 방식이다. 이를 통해 로컬 시스템에서 외부 서버로 안전하게 접속할 수 있다. - 예시: 로컬 시스템의 8080 포트로 들어오는 트래픽을 원격 서버의 80 포트로 전달. bash ssh -L 8080:remotehost:80 user@remotehost

원격 포트 포워딩

원격 포트 포워딩은 원격 서버의 포트로 들어오는 트래픽을 SSH 터널을 통해 로컬 시스템으로 전달하는 방식이다. 이를 통해 외부에서 로컬 네트워크에 안전하게 접근할 수 있다. - 예시: 원격 서버의 8080 포트로 들어오는 트래픽을 로컬 시스템의 80 포트로 전달. bash ssh -R 8080:localhost:80 user@remotehost

동적 포트 포워딩

동적 포트 포워딩은 SSH 터널을 통해 다양한 목적지로의 트래픽을 전달하는 방식이다. SOCKS 프록시처럼 작동하여, 여러 서버로의 트래픽을 프록시 서버를 통해 전달할 수 있다. - 예시: 로컬 시스템의 1080 포트에서 SOCKS 프록시를 설정하여 다양한 서버에 접속. bash ssh -D 1080 user@remotehost

프록시 점프 (ProxyJump)

프록시 점프는 SSH 클라이언트가 중간 서버(점프 호스트)를 거쳐 최종 목적지 서버에 접속하는 방식이다. 중간 서버를 경유하여 직접 접근이 불가능한 네트워크 환경에서도 안전하게 접속할 수 있다.

X11 포워딩

X11 포워딩은 원격 서버에서 실행 중인 GUI 응용 프로그램을 로컬 시스템에서 마치 로컬에서 실행하는 것처럼 사용할 수 있도록 해주는 기능이다. 이 기능은 SSH 터널을 통해 X11 디스플레이 프로토콜을 안전하게 전달한다. 이를 사용하면 원격 서버에서 실행되는 그래픽 응용 프로그램을 로컬에서 볼 수 있으며, 네트워크 상에서 데이터가 암호화되어 전달된다.

bash ssh -X user@remotehost

bash X11Forwarding yes

bash echo $DISPLAY

SSH 다중 세션 및 다중 명령 실행

SSH는 한 번의 연결로 여러 세션을 생성하거나, 여러 명령을 연속적으로 실행할 수 있는 기능을 제공한다. 이를 통해 효율적인 원격 시스템 관리가 가능하다.

bash ssh -M -S /tmp/ssh_control user@remotehost

bash ssh user@remotehost 'command1; command2'

SSH 복제 및 백업 (rsync)

rsync는 SSH를 기반으로 한 데이터 복제 및 백업 도구로, 원격 서버와 로컬 서버 간에 파일을 효율적으로 동기화할 수 있다. rsync는 차이점만을 전송하는 방식으로 동작하여, 네트워크 대역폭을 절약하고 전송 시간을 줄인다.

bash rsync -avz /local/dir/ user@remotehost:/remote/dir/

bash rsync -avz user@remotehost:/remote/dir/ /local/dir/

bash rsync -avz --delete /local/dir/ user@remotehost:/remote/dir/

SSH 연결 유지 및 재시도 설정

네트워크 환경이 불안정할 경우, SSH 연결이 자주 끊기는 문제가 발생할 수 있다. 이를 방지하고 SSH 연결을 안정적으로 유지하기 위한 설정이 있다.

bash ServerAliveInterval 60

서버 측에서도 sshd_config 파일에 다음 옵션을 설정할 수 있다.

bash ClientAliveInterval 60

bash ConnectTimeout 10 ConnectionAttempts 5

SSH 멀티팩터 인증 (MFA)

SSH 멀티팩터 인증(MFA)은 SSH 접속 시 추가적인 보안 계층을 제공하여, 단순한 비밀번호나 공개키 인증에 비해 훨씬 안전한 인증 절차를 구현할 수 있다. OpenSSH는 다양한 멀티팩터 인증 방식을 지원하며, 이를 통해 여러 가지 인증 방식을 조합하여 사용자의 신원을 확인할 수 있다.

bash ChallengeResponseAuthentication yes

PAM 설정 파일에도 다음을 추가해야 한다.

bash auth required pam_google_authenticator.so

bash PubkeyAuthentication yes AuthenticationMethods publickey,keyboard-interactive:pam

U2F 키 설정은 ssh-keygen 명령어로 생성할 수 있다.

bash ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk

SSH 터널링을 통한 VPN 구축

SSH를 사용하여 안전한 VPN(Virtual Private Network)을 구축할 수 있다. SSH 터널링을 활용하면 인터넷 상에서 안전하게 데이터를 전송하고, 원격 네트워크에 접속할 수 있다. VPN 기능은 특히 비공개 네트워크에 안전하게 접근할 때 유용하다.

SSH 기반 VPN 설정

SSH를 통해 VPN을 설정하려면 TUN/TAP 디바이스를 사용하여 네트워크 인터페이스를 가상화해야 한다. 이 방식은 SSH 터널을 통해 네트워크 트래픽을 안전하게 전송하는 방법을 제공한다.

bash PermitTunnel yes

bash ssh -w any:any user@remotehost

VPN 터널링을 통한 보안 네트워크 구성

SSH 기반 VPN은 다음과 같은 방법으로 보안 네트워크 구성을 할 수 있다: - 원격 네트워크의 내부 자원에 안전하게 접속할 수 있다. - 공용 네트워크에서 데이터 전송을 암호화하여 보안성을 강화한다.

성능 최적화

SSH 기반 VPN은 다른 VPN 솔루션에 비해 성능이 낮을 수 있기 때문에 최적화를 위해 여러 설정을 조정할 수 있다: - Compression 옵션 활성화: SSH 트래픽을 압축하여 데이터 전송 속도를 향상시킬 수 있다.

bash ssh -C user@remotehost

SSH 연결 제한 설정

SSH 서버에 대한 연결 요청을 제한하여, 불필요한 접속 시도를 막고 서버의 리소스를 보호할 수 있다. 이는 특히 무차별 대입 공격을 방지하고, 서버의 성능을 보호하는 데 도움이 된다.

bash MaxSessions 10

bash MaxStartups 10:30:60

위 설정은 10개의 SSH 연결 시도를 허용하며, 그 이후로는 연결이 30%의 확률로 거부되고, 60개 이상이 되면 완전히 차단된다.

bash LoginGraceTime 60