config 파일 설정
1. 개요
1. 개요
SSH는 네트워크를 통해 안전하게 원격 접속과 파일 전송을 가능하게 하는 프로토콜이다. SSH의 동작은 주로 텍스트 기반의 설정 파일(config file)에 의해 제어되며, 서버와 클라이언트의 행동을 세밀하게 정의한다. 올바른 설정은 시스템 보안과 기능성, 성능에 직접적인 영향을 미치므로 매우 중요하다.
주요 설정 파일은 서버 측의 sshd_config와 클라이언트 측의 ssh_config이다. 이 파일들은 일반적으로 /etc/ssh/ 디렉토리에 위치하며, 사용자별로 개별적인 설정을 덮어쓸 수 있는 홈 디렉토리 내 숨김 파일(~/.ssh/config)도 존재한다. 설정 파일은 간단한 키-값 쌍의 형태로 구성되어 있으며, 주석은 # 문자로 시작한다.
SSH 설정은 크게 인증 방식, 네트워크 연결, 암호화 알고리즘, 로깅, 포트 포워딩 등을 관리한다. 또한, 공개키 기반 구조를 활용한 키 관리 파일(authorized_keys, known_hosts 등)도 SSH 보안 및 자동화의 핵심 요소를 담당한다. 효과적인 관리를 위해서는 이러한 파일들의 구조와 주요 지시어(directive)에 대한 이해가 필수적이다.
2. SSH 서버 설정 파일 (sshd_config)
2. SSH 서버 설정 파일 (sshd_config)
SSH 서버 설정 파일은 일반적으로 /etc/ssh/sshd_config 경로에 위치합니다. 이 파일은 SSH 데몬(sshd)의 모든 동작 방식을 제어하는 구성 지시어들로 이루어집니다. 파일을 수정한 후에는 서비스를 재시작(systemctl restart sshd 또는 service ssh restart)하여 변경 사항을 적용해야 합니다. 기본 설정 파일에는 대부분의 지시어가 주석 처리되어 있으며, 필요한 설정만 주석을 해제하고 값을 변경하여 사용합니다.
주요 설정 지시어들은 다음과 같은 카테고리로 구분할 수 있습니다.
지시어 | 기본값 (일반적) | 설명 |
|---|---|---|
| 22 | SSH 서버가 리스닝하는 TCP 포트 번호입니다. |
| 0.0.0.0 | 서버가 바인딩할 IP 주소입니다. 모든 인터페이스를 의미합니다. |
| 2 | 사용할 SSH 프로토콜 버전입니다. 보안상 2만 사용하는 것이 권장됩니다. |
| prohibit-password | root 계정으로의 직접 로그인 허용 여부를 설정합니다. |
| yes | 패스워드 인증 방식을 허용할지 여부를 결정합니다. |
| yes | 공개키 인증 방식을 허용할지 여부를 결정합니다. |
| (지정 없음) | 로그인을 허용할 사용자 계정 목록을 지정합니다. |
| no | X11 포워딩 기능의 허용 여부를 설정합니다. |
인증 및 보안을 강화하기 위해 PermitRootLogin을 no로 설정하거나, PasswordAuthentication을 no로 설정하여 공개키 인증만 사용하도록 제한하는 것이 일반적입니다. 또한 AllowUsers 또는 AllowGroups 지시어를 사용하여 접근 가능한 사용자를 명시적으로 제한하는 것이 좋습니다. 네트워크 설정에서는 Port를 기본 22번에서 다른 번호로 변경하여 자동화된 공격 스캔을 완화할 수 있으며, ListenAddress를 특정 IP로 지정하여 서버가 특정 네트워크 인터페이스에서만 연결을 받도록 할 수 있습니다.
로그 및 감사와 관련된 설정으로는 LogLevel(로그 상세도), SyslogFacility(로그 구분), LoginGraceTime(로그인 제한 시간) 등이 있습니다. MaxAuthTries 지시어는 연결당 허용되는 최대 인증 시도 횟수를 제한하여 무차별 대입 공격을 방지하는 데 도움을 줍니다. 모든 설정 변경은 테스트 환경에서 검증한 후 운영 서버에 적용하며, 변경 후에는 반드시 서버에 대한 접근이 차단되지 않도록 주의해야 합니다.
2.1. 인증 및 보안 설정
2.1. 인증 및 보안 설정
SSH 서버의 인증 및 보안 설정은 sshd_config 파일에서 주로 Authentication 및 Security로 시작하는 지시어들을 통해 관리된다. 이 설정들은 누가 서버에 접근할 수 있는지, 어떤 방식으로 신원을 확인할지를 정의하여 시스템의 첫 번째 방어선을 구성한다.
가장 기본적인 설정은 비밀번호 인증의 허용 여부다. PasswordAuthentication yes는 비밀번호 로그인을 활성화하며, no로 설정하면 비밀번호 인증이 완전히 차단된다. 보안 강화를 위해 비밀번호 인증을 끄고 공개키 인증만 사용하는 것이 일반적이다. 공개키 인증은 PubkeyAuthentication yes로 활성화되며, 사용자의 공개키는 ~/.ssh/authorized_keys 파일에 저장되어 인증에 사용된다. 루트 계정의 직접 접근을 제한하려면 PermitRootLogin 지시어를 prohibit-password(공개키 인증만 허용) 또는 no(완전 차단)로 설정한다.
접근 제어는 사용자와 그룹 단위로도 세밀하게 설정할 수 있다. AllowUsers user1 user2는 특정 사용자만 접근을 허용하며, AllowGroups sshusers는 특정 그룹에 속한 사용자만 접근하도록 제한한다. 반대로 DenyUsers나 DenyGroups를 사용하여 특정 사용자나 그룹의 접근을 명시적으로 거부할 수도 있다. 로그인 실패를 방지하기 위해 빈 비밀번호 사용을 금지하는 PermitEmptyPasswords no 설정도 기본적으로 적용된다.
지시어 | 기본값 | 설명 | 보안 권장 설정 |
|---|---|---|---|
| yes | 비밀번호 인증 허용 여부 | no |
| yes | 공개키 인증 허용 여부 | yes |
| prohibit-password | 루트 계정 로그인 허용 방식 | prohibit-password 또는 no |
| (지정 없음) | 접근 허용 사용자 목록 | 필요한 사용자만 명시 |
| no | 빈 비밀번호 허용 여부 | no |
이러한 설정을 변경한 후에는 반드시 sudo systemctl reload ssh 또는 sudo service ssh reload 명령으로 SSH 데몬을 재시작하지 않고 설정만 다시 불러와야 변경 사항이 적용된다.
2.2. 네트워크 및 연결 설정
2.2. 네트워크 및 연결 설정
SSH 서버의 네트워크 및 연결 동작은 주로 /etc/ssh/sshd_config 파일의 설정을 통해 제어된다. 주요 설정 항목은 서버가 수신할 IP 주소와 TCP 포트, 동시 연결 수, 연결 유지 시간 등을 관리한다.
ListenAddress 지시어는 서버가 연결을 수신할 네트워크 인터페이스와 주소를 지정한다. 기본값은 0.0.0.0으로, 모든 사용 가능한 IPv4 주소에서 연결을 수락함을 의미한다. 특정 IP 주소만 수신하도록 제한하여 서버의 공격 표면을 줄일 수 있다. Port 지시어는 서비스가 실행될 TCP 포트 번호를 정의하며, 기본값은 22번이다. 보안 강화를 위해 기본 포트를 변경하는 것이 일반적이다. AddressFamily를 사용하면 IPv4만(inet), IPv6만(inet6), 또는 둘 다(any) 사용할 프로토콜 계열을 선택할 수 있다.
연결 관리와 관련된 중요한 설정은 다음과 같다.
지시어 | 기본값 | 설명 |
|---|---|---|
|
| 동시 인증 시도 최대 수[1] |
|
| 단일 네트워크 연결당 허용되는 다중 세션(채널) 수 |
|
| 활동 검사 메시지를 보낼 간격(초), 0이면 비활성 |
|
| 응답 없이 보낼 수 있는 활동 검사 메시지 최대 횟수 |
|
| 인증을 완료하기 위한 시간(초), 이후 연결 차단 |
MaxStartups는 서버가 처리할 수 있는 동시 미인증 연결 수를 제한하여 서비스 거부 공격(DoS)을 완화한다. ClientAliveInterval과 ClientAliveCountMax는 유휴 연결을 정리하는 데 사용된다. 예를 들어, ClientAliveInterval 300과 ClientAliveCountMax 2로 설정하면, 300초(5분) 동안 클라이언트로부터 활동이 없을 경우 활동 검사 패킷을 보내고, 최대 2번까지 응답이 없으면 연결을 종료한다. TCPKeepAlive 설정은 운영 체제 수준의 TCP Keepalive 패킷 사용 여부를 결정하며, 불안정한 네트워크에서 연결 상태를 확인하는 데 도움을 준다.
2.3. 로그 및 감사 설정
2.3. 로그 및 감사 설정
SSH 서버의 로그 및 감사 설정은 시스템 접근과 보안 사고를 추적하는 데 핵심적인 역할을 한다. 주요 설정은 /etc/ssh/sshd_config 파일에서 SyslogFacility와 LogLevel 지시어를 통해 조정된다. SyslogFacility는 로그 메시지를 보낼 시스템 로깅(syslog) 시설을 지정하며, 기본값은 AUTH이다. LogLevel은 기록할 로그 메시지의 상세 정도를 정의한다. INFO 수준은 일반적인 로그인 활동을 기록하는 반면, VERBOSE나 DEBUG 수준은 연결 과정에 대한 더 세부적인 정보를 제공하여 문제 해결에 유용하다[2].
로그 내용은 운영체제에 따라 /var/log/auth.log, /var/log/secure, 또는 시스템 저널(journalctl) 등에 저장된다. 감사를 강화하기 위해 sshd는 실패한 로그인 시도, 성공한 로그인, 그리고 사용된 인증 방법(예: 공개키 인증, 패스워드)을 기록한다. 특히 MaxAuthTries 지시어로 허용되는 최대 인증 시도 횟수를 제한하면, 연속된 실패 시도가 로그에 기록되고 연결이 차단되어 무차별 대입 공격(Brute-force attack) 탐지에 도움이 된다.
효과적인 감사를 위해 로그 파일의 무결성과 보존 기간을 관리해야 한다. 로그 로테이션(log rotation) 도구를 사용하여 로그 파일이 디스크 공간을 과도하게 차지하지 않도록 하고, 중앙 집중식 로그 관리 시스템에 로그를 전송하여 분석 및 장기 보관을 용이하게 할 수 있다. 정기적인 로그 모니터링과 비정상적인 패턴(예: 알려지지 않은 IP 주소로부터의 다량의 실패 시도)에 대한 알림 설정은 보안 사고의 조기 발견에 필수적이다.
3. SSH 클라이언트 설정 파일 (ssh_config)
3. SSH 클라이언트 설정 파일 (ssh_config)
SSH 클라이언트의 동작은 ssh_config 파일을 통해 제어됩니다. 이 파일은 일반적으로 /etc/ssh/ssh_config (시스템 전체 설정)와 사용자 홈 디렉터리의 ~/.ssh/config (사용자별 설정)에 위치합니다. 사용자별 설정은 시스템 전체 설정보다 우선순위가 높습니다. 설정은 호스트 이름, IP 주소, 와일드카드 패턴을 기반으로 특정 연결에 적용될 수 있으며, 명령줄에서 직접 지정하는 옵션이 가장 높은 우선순위를 가집니다.
ssh_config 파일의 핵심 기능은 호스트별 설정을 정의하는 것입니다. Host 지시어로 시작하는 블록을 사용하여 특정 서버 또는 서버 그룹에 대한 연결 매개변수를 그룹화할 수 있습니다. 이를 통해 반복적인 명령줄 옵션 입력을 줄이고, 별칭을 사용하여 복잡한 연결을 단순화할 수 있습니다. 예를 들어, 특정 포트를 사용하는 서버나 프록시 점프 호스트를 거쳐야 하는 서버에 대해 간단한 별칭을 정의할 수 있습니다.
지시어 | 설명 | 예시 값 |
|---|---|---|
| 설정 블록을 적용할 호스트 이름 패턴을 정의합니다. |
|
| 실제 연결할 호스트의 이름이나 IP 주소를 지정합니다. |
|
| 원격 서버에서 사용할 사용자 이름을 설정합니다. |
|
| 기본 SSH 포트(22) 대신 사용할 포트 번호를 지정합니다. |
|
| 사용할 개인키 파일의 경로를 지정합니다. |
|
연결 및 암호화 설정은 클라이언트가 서버와 어떻게 핸드셰이크하고 데이터를 암호화할지 결정합니다. Ciphers, HostKeyAlgorithms, KexAlgorithms 등의 지시어를 통해 사용할 암호화 스위트, 키 교환 알고리즘, 호스트 키 유형을 우선순위대로 지정할 수 있습니다. 이는 보안 요구사항이나 특정 서버의 호환성 문제를 해결하는 데 사용됩니다. 또한 ConnectTimeout으로 연결 시도 대기 시간을, ServerAliveInterval과 ServerAliveCountMax로 유휴 연결이 끊어지는 것을 방지할 수 있습니다. ProxyJump 또는 ProxyCommand 지시어는 베스천 호스트나 다른 프록시를 통해 목적지 서버에 접속하는 복잡한 네트워크 경로를 설정하는 데 필수적입니다.
3.1. 호스트별 설정
3.1. 호스트별 설정
ssh_config 파일에서 Host 지시어를 사용하여 특정 호스트나 호스트 패턴에만 적용되는 설정 블록을 정의할 수 있습니다. 이는 서로 다른 서버에 서로 다른 연결 매개변수를 사용해야 할 때 매우 효율적입니다. 와일드카드 패턴을 사용하여 여러 호스트를 하나의 설정으로 그룹화할 수도 있습니다.
일반적인 Host 블록의 구조는 다음과 같습니다.
지시어 | 설명 | 예시 |
|---|---|---|
| 설정을 적용할 호스트명 패턴을 지정합니다. |
|
| 실제 연결할 호스트의 주소나 도메인을 지정합니다. |
|
| 연결 시 사용할 사용자 이름을 지정합니다. |
|
| 연결할 SSH 포트를 지정합니다. |
|
| 사용할 개인 키 파일의 경로를 지정합니다. |
|
와일드카드 *와 ?를 사용하여 패턴을 구성할 수 있습니다. 예를 들어, Host *.example.com은 example.com 도메인의 모든 서버에 설정을 적용합니다. Host 192.168.1.*은 해당 대역의 모든 IP 주소에 적용됩니다. 설정은 첫 번째로 매칭되는 Host 블록의 내용이 적용되므로, 구체적인 패턴을 먼저 작성하고 일반적인 패턴을 뒤에 두는 것이 좋습니다.
다음은 호스트별 설정의 실제 예시입니다. 회사 내부 서버는 특정 포트와 키를 사용하고, GitHub은 별도의 키를 사용하며, 테스트 서버 그룹에는 공통 옵션을 적용하는 구성입니다.
```
# 회사 게이트웨이 서버
Host gateway
HostName corp-gateway.example.com
User admin
Port 2022
IdentityFile ~/.ssh/id_rsa_corp
# GitHub 연결 (ssh git@github.com 명령에 적용)
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
# 192.168.10.0/24 대역의 모든 테스트 서버에 공통 설정 적용
Host 192.168.10.*
User tester
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
```
3.2. 연결 및 암호화 설정
3.2. 연결 및 암호화 설정
이 섹션은 SSH 클라이언트가 서버에 연결할 때 사용하는 암호화 알고리즘, 프로토콜 버전, 연결 관련 매개변수를 제어하는 설정을 다룬다. 주요 설정은 사용자별 또는 시스템 전체의 ~/.ssh/config 또는 /etc/ssh/ssh_config 파일에서 정의한다.
연결 설정에는 연결 유지 메커니즘이 포함된다. ServerAliveInterval은 클라이언트가 서버로 활성 상태 확인 패킷을 보내는 간격(초)을 설정한다. 이는 불안정한 네트워크에서 연결이 끊어지는 것을 방지한다. ServerAliveCountMax는 응답 없이 보낼 수 있는 최대 확인 패킷 수를 지정한다. 또한 ConnectTimeout은 연결 시도 실패 전 대기 시간을, ControlMaster와 ControlPath는 동일한 서버에 대한 다중 세션을 단일 네트워크 연결로 멀티플렉싱하여 연결 속도를 높이는 기능을 제공한다.
암호화 설정은 통신의 보안 수준과 호환성을 결정한다. Ciphers 지시어는 사용할 대칭키 암호 알고리즘의 우선순위 목록을 지정한다(예: aes256-gcm@openssh.com, chacha20-poly1305@openssh.com). MACs는 데이터 무결성 검증을 위한 메시지 인증 코드 알고리즘을, KexAlgorithms는 키 교환 알고리즘을 선택한다. 프로토콜 버전은 Protocol 지시어로 제어하며, 보안상 Protocol 2만 사용하는 것이 권장된다. 호스트 키 알고리즘의 우선순위는 HostKeyAlgorithms로 관리할 수 있다.
설정 지시어 | 기본값 예시 | 설명 |
|---|---|---|
| 다양함[3] | 사용할 암호화 알고리즘의 우선순위 목록 |
| 다양함 | 키 교환 알고리즘의 우선순위 목록 |
| 다양함 | 메시지 인증 코드 알고리즘의 우선순위 목록 |
| 0 (비활성) | 서버 활성 상태 확인 패킷 전송 간격(초) |
| 2 | 사용할 SSH 프로토콜 버전 (1 또는 2) |
| 시스템 TCP 타임아웃 | 연결 시도 타임아웃 시간(초) |
이러한 설정을 조정하면 특정 보안 요구사항을 충족하거나, 레거시 시스템과의 호환성을 유지하거나, 네트워크 조건에 맞춰 연결 안정성과 성능을 최적화할 수 있다.
4. 키 관리 파일 (authorized_keys, known_hosts)
4. 키 관리 파일 (authorized_keys, known_hosts)
SSH 공개키 인증을 구성하는 핵심 파일은 ~/.ssh/authorized_keys와 ~/.ssh/known_hosts이다. 이 파일들은 각각 사용자 인증과 서버 호스트 검증을 담당하여 비밀번호 없이 안전한 접속을 가능하게 한다.
authorized_keys 파일은 SSH 서버 측에 위치하며, 특정 사용자 계정으로 로그인을 허용할 공개키 목록을 저장한다. 클라이언트가 접속을 시도하면, 서버는 이 파일에 등록된 공개키와 클라이언트가 제시한 개인키 서명을 비교하여 인증한다. 한 줄에 하나의 공개키를 기록하며, 각 줄 시작 부분에 command="제한명령"과 같은 옵션을 추가하여 해당 키로 접속 시 실행될 명령을 제한하거나, from="IP주소" 옵션으로 접속 출처를 제한할 수 있다[4]. 이 파일의 권한은 반드시 소유자만 읽고 쓸 수 있도록 설정되어야 하며(chmod 600 ~/.ssh/authorized_keys), 그렇지 않으면 보안상 이유로 SSH 서버가 이를 무시할 수 있다.
known_hosts 파일은 SSH 클라이언트 측에 위치하여 접속한 서버의 신원을 검증한다. 클라이언트가 서버에 처음 접속하면 해당 서버의 공개 호스트 키를 이 파일에 지문(fingerprint) 형태로 저장한다. 이후 접속 시마다 서버가 제시하는 키와 저장된 키를 비교하여, 중간자 공격(Man-in-the-Middle attack)으로 인한 서버 위장을 방지한다. 파일 형식은 다음과 같다.
서버 주소 | 키 유형 | 공개키 (Base64) |
|---|---|---|
|
|
|
|
|
|
신뢰할 수 없는 호스트 키로 인해 접속이 거부될 경우, 해당 줄을 파일에서 수동으로 삭제하여 문제를 해결할 수 있다. 글로벌 호스트 키는 일반적으로 /etc/ssh/ssh_known_hosts에 시스템 전체적으로 관리된다.
4.1. 공개키 인증 설정
4.1. 공개키 인증 설정
공개키 인증은 비밀번호 인증보다 높은 보안성을 제공하는 SSH의 핵심 인증 방식이다. 이 방식은 비대칭 암호 방식을 기반으로 하며, 사용자는 한 쌍의 암호 키를 생성한다. 개인키는 사용자의 로컬 시스템에 안전하게 보관하고, 공개키는 접속하려는 원격 서버의 ~/.ssh/authorized_keys 파일에 등록한다. 인증 시 서버는 공개키로 암호화된 챌린지를 보내고, 클라이언트는 개인키로 이를 복호화하여 응답함으로써 신원을 증명한다[5].
authorized_keys 파일의 각 행은 하나의 허용된 공개키를 정의한다. 기본 형식은 키 유형, 공개키 데이터, 그리고 선택적인 옵션으로 구성된다. 주요 옵션은 다음과 같다.
옵션 | 설명 |
|---|---|
| 해당 키로 접속 시 실행될 특정 명령어를 제한한다. |
| 특정 호스트에서만 키 사용을 허용한다. |
| 에이전트 포워딩을 비활성화한다. |
| 포트 포워딩을 비활성화한다. |
| 의사 터미널(pty) 할당을 금지한다. |
예를 들어, command="/usr/bin/data_backup.sh",no-port-forwarding,no-pty ssh-ed25519 AAAAB3NzaC...와 같은 형식으로 키에 제한을 걸 수 있다. 이는 자동화된 작업에 사용되는 키의 권한을 최소화하는 데 유용하다.
설정을 완료한 후에는 authorized_keys 파일의 권한이 올바른지 반드시 확인해야 한다. 일반적으로 사용자의 홈 디렉토리(~) 권한은 755(drwxr-xr-x) 또는 700(drwx------)이어야 하며, ~/.ssh 디렉토리는 700(drwx------), authorized_keys 파일 자체는 600(-rw-------) 또는 644(-rw-r--r--)로 설정된다. 너무 느슨한 권한(예: 그룹 또는 다른 사용자에게 쓰기 권한 부여)은 SSH 데몬이 보안상 이유로 키를 거부할 수 있다.
4.2. 호스트 키 검증
4.2. 호스트 키 검증
SSH 클라이언트는 서버에 처음 연결할 때 서버의 공개 호스트 키를 받아 ~/.ssh/known_hosts 파일에 저장합니다. 이후 동일한 서버에 연결할 때는 저장된 키와 서버가 제공하는 키를 비교하여 일치 여부를 검증합니다. 이 과정은 중간자 공격을 방지하는 핵심적인 보안 메커니즘입니다.
known_hosts 파일의 각 항목은 서버 주소(호스트명 또는 IP), 사용된 암호화 알고리즘, 그리고 서버의 공개 호스트 키로 구성됩니다. 클라이언트는 연결 시점에 서버에서 전송받은 키가 파일에 기록된 키와 일치하는지 확인합니다. 키가 일치하면 연결을 진행하고, 일치하지 않으면 경고 메시지를 사용자에게 표시합니다.
상황 | 클라이언트 동작 | 의미 |
|---|---|---|
키가 | 정상 연결 | 서버 신원이 확인된 안전한 연결입니다. |
키가 | 경고 발생 및 연결 차단[6] | 서버 키가 변경되었거나 중간자 공격 가능성이 있습니다. |
키가 | 새로운 키를 저장할지 묻는 메시지 표시 | 서버에 처음 연결하는 경우입니다. |
호스트 키 변경은 서버 재설치, OS 재설치, 또는 의도적인 키 교체 시 발생할 수 있습니다. 정기적인 키 변경이 예정되어 있다면 사용자에게 사전 공지해야 합니다. 검증을 완전히 비활성화하는 StrictHostKeyChecking no 옵션은 보안 위험을 크게 증가시키므로 테스트 환경을 제외하고는 사용하지 않는 것이 좋습니다. 대신, 신뢰할 수 없는 초기 연결을 허용하는 StrictHostKeyChecking accept-new 옵션이 더 안전한 대안으로 고려될 수 있습니다.
5. 고급 설정 및 튜닝
5. 고급 설정 및 튜닝
SSH의 고급 설정은 기본적인 원격 접속 기능을 넘어 포트 포워딩과 터널링을 구성하거나 연결 성능을 최적화하는 것을 포함한다. 이러한 설정은 주로 클라이언트 측 ssh_config 파일이나 서버 측 sshd_config 파일에서 조정할 수 있으며, 명령줄 옵션으로도 직접 지정이 가능하다.
포트 포워딩은 크게 로컬 포트 포워딩, 원격 포트 포워딩, 동적 포트 포워딩으로 구분된다. 로컬 포트 포워딩(-L)은 클라이언트 머신의 특정 포트로 들어오는 연결을 SSH 터널을 통해 서버의 다른 포트로 전달한다. 이는 내부 네트워크의 데이터베이스 서비스에 안전하게 접근하는 데 흔히 사용된다. 반면, 원격 포트 포워딩(-R)은 서버의 포트를 클라이언트 측의 서비스로 연결하여, 외부에서 내부 네트워크의 서비스에 접근할 수 있는 게이트웨이를 제공한다. 동적 포트 포워딩(-D)은 SOCKS 프록시 서버를 설정하여, 모든 트래픽을 SSH 터널을 통해 라우팅할 수 있게 한다. 서버 설정 파일에서는 AllowTcpForwarding 지시어로 이러한 기능을 전역적으로 허용하거나 제한할 수 있다.
성능 최적화를 위해 여러 가지 매개변수를 조정할 수 있다. 네트워크 대역폭이 제한된 환경에서는 Compression 옵션을 'yes' 또는 'delayed'로 설정하여 데이터를 압축하여 전송할 수 있다. 지연 시간이 긴 연결에서는 ServerAliveInterval과 ServerAliveCountMax 클라이언트 옵션을 설정하여 연결이 불필요하게 끊어지는 것을 방지한다. 다중 연결을 효율적으로 관리하기 위해 ControlMaster, ControlPath, ControlPersist 지시어를 사용하면, 동일한 대상 서버에 대한 여러 세션이 하나의 암호화 채널을 공유하여 인증 오버헤드와 연결 설정 시간을 줄일 수 있다. 암호화 오버헤드를 줄이기 위해 더 빠른 암호화 알고리즘을 선호하도록 Ciphers 지시어의 순서를 변경할 수도 있다.
설정 범주 | 주요 지시어/옵션 | 설명 및 일반적인 값 예시 |
|---|---|---|
포트 포워딩 |
| 로컬 포트 포워딩 규칙을 설정 파일에 고정적으로 정의한다. 예: |
| 서버에서 포트 포워딩 허용 여부를 제어한다. 값: | |
연결 관리 |
| 다중 세션을 위한 연결 공유를 활성화한다. |
성능/안정성 |
| 데이터 압축 사용 여부를 설정한다. |
| 클라이언트가 서버로 활성 상태 패킷을 보내는 간격(초)을 설정한다. 지연이 큰 연결에서는 30 또는 60으로 설정한다. |
5.1. 포트 포워딩 및 터널링
5.1. 포트 포워딩 및 터널링
SSH는 단순한 원격 접속 도구를 넘어 안전한 네트워크 터널을 생성하는 기능을 제공한다. 이 터널링 기능은 주로 방화벽 뒤에 있거나 특정 포트 접근이 제한된 서비스에 안전하게 접근하기 위해 사용된다. 기본적인 원리는 SSH 연결을 통해 암호화된 통로를 만들고, 그 안에서 다른 프로토콜의 트래픽을 전달하는 것이다. 이러한 기능은 ssh 명령어의 -L, -R, -D 옵션을 통해 구성할 수 있으며, 클라이언트 설정 파일(ssh_config)에서 지속적인 설정이 가능하다.
가장 일반적인 형태는 로컬 포트 포워딩(Local Port Forwarding)이다. 이는 클라이언트 머신의 특정 포트를 SSH 서버를 경유하여 목적지 서비스에 연결한다. 예를 들어, ssh -L 8080:내부서버:80 사용자@ssh서버 명령은 클라이언트의 8080번 포트로 들어오는 연결을 SSH 서버를 통해 '내부서버'의 80번 포트(HTTP)로 전달한다. 이는 데이터베이스나 웹 관리 콘솔 같은 내부 서비스에 안전하게 접근할 때 유용하다.
반대로 원격 포트 포워딩(Remote Port Forwarding)은 서버의 포트를 클라이언트나 다른 서버의 서비스에 연결한다. ssh -R 9000:localhost:3000 사용자@ssh서버 명령은 SSH 서버의 9000번 포트로 들어오는 연결을, SSH 명령을 실행한 클라이언트 머신의 3000번 포트로 되돌려 보낸다. 이는 주로 홈 네트워크나 개발 환경의 서비스를 외부에서 접근 가능하게 할 때 사용된다. 또한 동적 포트 포워딩(Dynamic Port Forwarding, -D 옵션)은 SOCKS 프록시 서버를 생성하여, 클라이언트 애플리케이션의 모든 트래픽을 SSH 터널을 통해 라우팅할 수 있게 한다.
포워딩 유형 | SSH 옵션 | 기본 동작 | 주요 사용 사례 |
|---|---|---|---|
로컬 포트 포워딩 |
| 클라이언트 → SSH 서버 → 목적지 서비스 | 내부망 웹 서비스/데이터베이스 접근 |
원격 포트 포워딩 |
| SSH 서버 → 클라이언트 → 로컬 서비스 | 로컬 개발 서버 외부 노출, 역방향 접속 |
동적 포트 포워딩 |
| 클라이언트 애플리케이션 → SSH 서버 → 임의 목적지 | 웹 브라우징 등 전체 트래픽의 보안 터널링 |
이러한 설정은 명령행 옵션 외에도 ~/.ssh/config 파일에 호스트별로 영구적으로 정의할 수 있다. 예를 들어, LocalForward 8080 내부서버:80 지시어를 사용하면 해당 호스트로 연결할 때마다 자동으로 로컬 포트 포워딩이 설정된다. 서버 측에서는 sshd_config 파일에서 AllowTcpForwarding 지시어를 통해 포트 포워딩 기능 전체를 허용하거나 제한할 수 있다.
5.2. 성능 최적화
5.2. 성능 최적화
SSH 연결의 성능을 최적화하기 위해서는 네트워크 대역폭 사용을 줄이고, 암호화 오버헤드를 최소화하며, 연결 설정 시간을 단축하는 설정을 고려할 수 있다. 주요 접근 방식은 데이터 압축 사용, 암호화 알고리즘 선택, 연결 지속성 관리 등이다.
압축 설정은 네트워크 대역폭이 제한된 환경에서 유용하다. 클라이언트 설정 파일(ssh_config)에서 Compression yes 지시어를 사용하면 전송 데이터가 실시간으로 압축된다. 특정 상황에서만 압축을 활성화하려면 Compression delayed 옵션을 사용할 수 있다. 이는 원격 셸을 시작하기 전까지 압축을 지연시켜, 터미널 상호작용과 같은 짧은 데이터 교환 시 불필요한 오버헤드를 방지한다. 사용 가능한 압축 알고리즘은 CompressionLevel 지시어로 조정할 수 있으며, 값이 높을수록 압축률은 증가하지만 CPU 사용량도 함께 증가한다.
암호화 및 MAC(메시지 인증 코드) 알고리즘 선택은 성능에 큰 영향을 미친다. 오래되거나 덜 효율적인 알고리즘을 사용하면 지연이 발생할 수 있다. ssh_config 파일에서 Ciphers와 MACs 지시어를 사용하여 클라이언트 측에서 선호하는 알고리즘 목록을 지정할 수 있다. 일반적으로 chacha20-poly1305@openssh.com, aes128-gcm@openssh.com와 같은 현대적인 AEAD 암호는 속도와 보안 측면에서 효율적이다. 서버 측(sshd_config)에서도 동일한 지시어를 통해 지원하는 알고리즘을 제한할 수 있다. 다음은 일반적인 알고리즘 성능 특성을 비교한 표이다.
알고리즘 유형 | 예시 | 일반적 성능 특성 |
|---|---|---|
대칭키 암호 |
|
|
키 교환 알고리즘 |
|
|
메시지 인증 코드 |
|
|
연결 다중화와 컨트롤 마스터 기능은 반복적인 연결 시 성능을 크게 향상시킨다. ssh_config에서 ControlMaster auto, ControlPath, ControlPersist 지시어를 설정하면, 단일 네트워크 연결을 통해 여러 SSH 세션을 공유할 수 있다. 이는 매번 새로운 연결을 수립하고 암호화 핸드셰이크를 수행하는 오버헤드를 제거하여, 동일한 서버에 대한 후속 연결을 거의 즉시 완료되게 한다. 특히 스크립트나 자동화 도구가 짧은 간격으로 여러 명령을 실행할 때 효과적이다.
6. 문제 해결 및 디버깅
6. 문제 해결 및 디버깅
SSH 연결 문제는 설정 오류, 네트워크 문제, 인증 실패 등 다양한 원인에서 발생할 수 있다. 효과적인 문제 해결을 위해서는 체계적인 접근과 로그 파일 분석이 필수적이다. 가장 먼저 확인해야 할 것은 SSH 서비스의 실행 상태이다. systemctl status sshd(또는 service ssh status) 명령어로 서비스가 정상적으로 동작 중인지 확인할 수 있다. 서비스가 중지되었다면 시작하고, 설정 파일(sshd_config)을 변경한 후에는 반드시 서비스를 재시작해야 변경 사항이 적용된다.
디버깅 모드를 활용하는 것이 근본 원인을 파악하는 데 큰 도움이 된다. 클라이언트 측에서는 ssh -v(verbose) 옵션을 사용하면 연결 과정의 상세 정보를 실시간으로 출력한다. 문제가 심각할 경우 -vvv 옵션으로 더 자세한 정보를 얻을 수 있다. 서버 측 디버깅을 위해서는 sshd 데몬을 -d 옵션과 함께 포그라운드에서 실행할 수 있다. 예를 들어, sshd -d -p 2222 명령은 2222번 포트에서 디버깅 모드로 데몬을 실행하여 클라이언트의 연결 시도를 상세히 로깅한다. 이 방법은 설정 오류나 인증 실패 단계를 정확히 파악할 때 유용하다.
주요 문제 유형과 확인 사항은 다음과 같다.
문제 유형 | 확인 사항 |
|---|---|
연결 거부 | 방화벽(iptables, firewalld) 규칙, sshd_config의 |
인증 실패 | authorized_keys 파일 권한(600), 클라이언트 개인키 파일 권한(400), |
호스트 키 검증 실패 | known_hosts 파일의 오래되거나 변경된 항목, |
느린 연결 | sshd_config의 |
로그 파일은 문제 해결의 핵심 단서를 제공한다. 서버의 인증 로그(/var/log/auth.log 또는 /var/log/secure)를 확인하면 로그인 시도, 실패 이유, 사용자, IP 주소 등이 기록되어 있다. "Failed password for", "Authentication refused", "Permission denied" 등의 키워드로 검색하면 원인을 빠르게 좁힐 수 있다. 클라이언트의 ~/.ssh/config 파일에 호스트별 설정이 중복되거나 충돌하는 경우도 발생하므로, 임시로 해당 파일의 이름을 변경하여 기본 설정으로 테스트해 보는 것도 방법이다.
7. 보안 모범 사례
7. 보안 모범 사례
SSH 서버와 클라이언트의 설정 파일을 구성할 때는 보안을 최우선으로 고려해야 한다. 기본 설정은 편의성을 위해 다소 느슨한 경우가 많으므로, 배포 직후 적절한 조치를 취하는 것이 중요하다.
가장 기본적이면서도 효과적인 조치는 루트 계정으로의 직접 로그인을 비활성화하는 것이다. sshd_config 파일에서 PermitRootLogin 지시어를 no로 설정하면, 공격자가 가장 권한이 높은 계정을 직접 대상으로 하는 것을 방지할 수 있다. 또한, 오래되고 취약한 암호화 알고리즘과 인증 방식을 명시적으로 비활성화해야 한다. 예를 들어, KexAlgorithms, Ciphers, MACs 지시어를 사용하여 최신의 안전한 알고리즘만 허용하도록 제한한다. 비밀번호 인증보다 공개키 인증이 훨씬 안전하므로, PasswordAuthentication을 no로 설정하여 비밀번호 로그인을 완전히 차단하는 것이 좋다.
네트워크 접근을 최소화하는 원칙도 적용해야 한다. ListenAddress 지시어를 사용하여 SSH 서버가 특정 IP 주소에서만 수신하도록 제한할 수 있으며, 불필요한 모든 사용자 계정의 쉘 접근을 차단해야 한다. AllowUsers 또는 AllowGroups 지시어를 활용하면 SSH 접속이 허용되는 사용자 또는 그룹을 화이트리스트 방식으로 명시적으로 지정할 수 있다. 관리 포트인 22번 포트를 변경하는 것은 자동화된 스캔 공격을 피하는 간단한 방법이 될 수 있지만, 보안의 핵심은 포트 변경이 아니라 앞서 언급한 강력한 인증과 암호화 설정에 있음을 명심해야 한다.
정기적인 감사와 업데이트는 지속적인 보안을 보장한다. sshd_config 파일의 변경 사항은 반드시 서비스 재시작(systemctl restart sshd) 전에 sshd -t 명령어로 문법 검사를 수행해야 한다. /var/log/auth.log 또는 /var/log/secure와 같은 로그 파일을 모니터링하여 실패한 접속 시도와 기타 의심스러운 활동을 확인한다. 마지막으로, SSH 서버 소프트웨어 자체와 운영 체제를 최신 보안 패치 상태로 유지하는 것은 알려진 취약점으로부터 시스템을 보호하는 필수 절차이다.
