시스템 관리자를 위한 필수 SSH 명령어
서론
Secure Shell (SSH)은 서버 및 네트워크 장비의 안전한 원격 관리를 위한 기반입니다. 시스템 관리자에게 SSH 마스터는 단순한 기술이 아니라 인프라를 효율적이고 안전하게 관리하기 위한 근본적인 필수 요소입니다. SSH는 강력한 암호화를 사용하여 보안되지 않은 네트워크를 통해 보안 채널을 제공하며, 비밀번호, 명령 및 파일 전송을 포함한 모든 통신이 기밀로 유지되고 도청으로부터 보호되도록 보장합니다.
이 문서는 모든 시스템 관리자가 알아야 할 가장 필수적인 SSH 명령 및 개념에 대한 종합 가이드 역할을 합니다. 기본적인 연결 방법과 안전한 파일 전송부터 포트 포워딩 및 영구 연결과 같은 고급 기술에 이르기까지 모든 것을 자세히 다룰 것입니다. 이러한 명령과 모범 사례를 이해하고 구현함으로써 원격 서버 관리 기능을 크게 향상하고 워크플로우를 간소화하며 모든 환경에서 강력한 보안 태세를 유지할 수 있습니다.
기본적인 SSH 연결 설정
SSH의 가장 기본적인 용도는 원격 서버와 안전한 대화형 셸 세션을 설정하는 것입니다. 기본 구문은 간단하며 사용자 이름과 대상 호스트를 지정할 수 있습니다.
원격 서버에 연결
현재 로컬 사용자 이름을 사용하여 원격 서버에 연결하려면:
ssh hostname_or_IP_address
원격 서버의 사용자 이름이 로컬 사용자 이름과 다른 경우, 다음과 같이 지정해야 합니다:
ssh username@hostname_or_IP_address
예시:
ssh [email protected]
ssh [email protected]
사용자 지정 포트 지정
기본적으로 SSH는 22번 포트를 사용합니다. 그러나 보안상의 이유나 특정 네트워크 구성으로 인해 서버는 다른 포트에서 수신하는 경우가 많습니다. -p 플래그를 사용하여 사용자 지정 포트를 지정할 수 있습니다:
ssh -p 2222 username@hostname_or_IP_address
팁: 기본 SSH 포트(22번 포트)를 변경하는 것은 자동화된 공격 시도를 줄이기 위한 일반적인 보안 관행이지만, 강력한 인증을 대체하지는 않습니다.
SSH 키 기반 인증
비밀번호 인증이 일반적이지만, 키 기반 인증은 SSH에 권장되며 더 안전한 방법입니다. 이는 한 쌍의 암호화 키를 사용합니다: 로컬 머신에 비밀로 보관되는 개인 키와 원격 서버에 배치되는 공개 키입니다.
SSH 키 쌍 생성
ssh-keygen을 사용하여 새 키 쌍을 생성합니다. 개인 키에는 강력한 암호 문구를 사용하는 것이 좋습니다.
ssh-keygen -t rsa -b 4096
이 명령은 4096비트 길이의 RSA 키 쌍을 생성합니다. 개인 키(id_rsa)와 공개 키(id_rsa.pub)는 일반적으로 ~/.ssh/에 저장됩니다.
공개 키를 원격 서버에 복사
키 기반 인증을 활성화하려면 공개 키가 원격 서버의 ~/.ssh/authorized_keys 파일에 배치되어야 합니다. ssh-copy-id 유틸리티가 이 과정을 자동화합니다:
ssh-copy-id username@hostname_or_IP_address
이 명령은 원격 사용자의 비밀번호를 한 번만 요청한 다음 공개 키를 복사하고 올바른 권한을 설정합니다. 이 후에는 비밀번호 없이 연결할 수 있습니다(암호 문구를 설정했다면 개인 키의 암호 문구를 요청받을 수 있습니다).
경고: 개인 키는 누구와도 공유하지 마십시오. 엄격한 파일 권한(chmod 600 ~/.ssh/id_rsa)을 가져야 합니다.
SSH 연결 및 구성 관리
원격으로 단일 명령 실행
SSH는 대화형 셸만을 위한 것이 아닙니다. 원격 서버에서 단일 명령을 직접 실행하고 그 출력을 로컬 터미널로 반환할 수 있습니다.
ssh username@hostname_or_IP_address 'command_to_execute'
예시:
ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'
SSH 구성 파일 (~/.ssh/config) 사용
자주 연결하는 경우, ~/.ssh/config에 호스트를 정의하면 시간을 절약하고 명령어를 간소화할 수 있습니다. 이 파일을 통해 별칭, 사용자, 포트, 개인 키 및 기타 연결 옵션을 설정할 수 있습니다.
~/.ssh/config 항목 예시:
Host webserver
Hostname 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_web
ForwardAgent yes
Host devbox
Hostname dev.mydomain.com
User developer
Port 22
IdentityFile ~/.ssh/id_rsa_dev
일단 구성되면 별칭을 사용하여 간단히 연결할 수 있습니다:
ssh webserver
ssh devbox
모범 사례: 복잡한 SSH 연결을 관리할 때는 항상 ~/.ssh/config 파일을 사용하십시오. 가독성을 향상하고, 입력 오류를 줄이며, 구성을 중앙 집중화합니다.
SSH를 사용한 보안 파일 전송
SSH는 보안 파일 전송을 위한 두 가지 주요 도구인 scp와 sftp를 제공합니다.
scp (Secure Copy Protocol)
scp는 로컬 호스트와 원격 호스트 간에 파일 및 디렉터리를 복사하는 데 사용됩니다. SSH와 동일한 인증 및 보안 메커니즘을 사용합니다.
로컬에서 원격으로 파일 복사
scp /path/to/local/file username@hostname_or_IP_address:/path/to/remote/directory/
예시:
scp my_app.tar.gz admin@webserver:/var/www/html/
원격에서 로컬로 파일 복사
scp username@hostname_or_IP_address:/path/to/remote/file /path/to/local/directory/
예시:
scp admin@webserver:/var/log/nginx/access.log ~/logs/
디렉터리 재귀적으로 복사
디렉터리에는 -r 플래그를 사용하십시오:
rscp -r /path/to/local/dir username@hostname_or_IP_address:/path/to/remote/parent_dir/
파일 속성 유지
수정 시간, 접근 시간 및 모드를 유지하려면 -p 플래그를 사용하십시오:
scp -p localfile user@remotehost:/remotepath/
sftp (SSH File Transfer Protocol)
sftp는 FTP와 유사하지만 SSH로 보호되는 대화형 파일 전송 프로그램을 제공합니다. 여러 파일을 관리하거나 복잡한 디렉터리 작업을 수행하는 데 이상적입니다.
SFTP 서버에 연결
sftp username@hostname_or_IP_address
연결되면 sftp> 프롬프트가 표시됩니다. 일반적인 명령은 다음과 같습니다:
ls: 원격 디렉터리 내용 나열lls: 로컬 디렉터리 내용 나열cd remote_directory: 원격 디렉터리 변경lcd local_directory: 로컬 디렉터리 변경get remote_file: 파일 다운로드put local_file: 파일 업로드mget remote_files: 여러 파일 다운로드 (와일드카드 지원)mput local_files: 여러 파일 업로드 (와일드카드 지원)exit또는bye: SFTP 세션 종료
SFTP 세션 예시:
sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini data/ logs/ public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye
SSH 터널링 및 포트 포워딩
SSH 터널링 또는 포트 포워딩을 사용하면 로컬 포트와 원격 포스 간에 보안 연결을 생성하여 방화벽에 의해 차단되거나 직접 접근할 수 없는 서비스에 접근할 수 있습니다.
로컬 포트 포워딩 (-L)
로컬 포워딩을 사용하면 원격 네트워크(또는 원격 서버 자체)의 서비스에 로컬 머신에서 마치 로컬에서 실행되는 것처럼 접근할 수 있습니다.
ssh -L [local_port]:[remote_host]:[remote_port] username@ssh_server
예시: 점프 호스트 ssh_server를 통해 개인 네트워크의 데이터베이스 서버(3306번 포트)에 로컬 머신의 9000번 포트에서 접근합니다.
ssh -L 9000:db.private.net:3306 [email protected]
이제 로컬 머신의 localhost:9000에 연결하면 jumphost.com을 통해 db.private.net:3306으로 연결이 안전하게 전달됩니다.
원격 포트 포워딩 (-R)
원격 포워딩은 로컬 머신(또는 로컬 네트워크)의 서비스를 원격 서버에서, 그리고 잠재적으로 원격 서버 네트워크의 클라이언트에서 접근할 수 있도록 합니다.
ssh -R [remote_port]:[local_host]:[local_port] username@ssh_server
예시: 로컬 웹 서버(8000번 포트)를 ssh_server의 8080번 포트에서 접근할 수 있도록 만듭니다.
ssh -R 8080:localhost:8000 admin@remote_server.com
이제 remote_server.com의 모든 사용자는 remote_server.com에서 localhost:8080에 연결하여 로컬 웹 서버에 접근할 수 있습니다.
동적 포트 포워딩 (-D)
동적 포트 포워딩은 SOCKS 프록시를 생성하여 모든 트래픽(또는 애플리케이션 특정 트래픽)을 SSH 터널을 통해 라우팅할 수 있도록 합니다. 이는 방화벽을 우회하거나 브라우징 보안을 강화하는 데 유용합니다.
ssh -D [local_port] username@ssh_server
예시: ssh_server를 통해 로컬 머신의 1080번 포트에 SOCKS 프록시를 생성합니다.
ssh -D 1080 [email protected]
브라우저 또는 애플리케이션을 localhost:1080을 SOCKS5 프록시로 사용하도록 구성하면 모든 네트워크 트래픽이 jumphost.com을 통해 터널링됩니다.
고급 SSH 사용법 및 팁
백그라운드에서 명령 실행
비대화형 명령을 백그라운드에서 실행하고 분리해야 하는 경우, -f 플래그(명령 실행 전에 백그라운드로 이동)와 -N 플래그(원격 명령을 실행하지 않음)를 사용할 수 있습니다.
ssh -f -N -L 9000:db.private.net:3306 [email protected]
이것은 로컬 포트 포워드를 백그라운드에서 설정합니다.
SSH 에이전트 및 ssh-add
ssh-agent는 개인 키를 메모리에 보관하는 프로그램이므로 세션당 한 번만 암호 문구를 입력하면 됩니다. ssh-add는 에이전트에 키를 추가합니다.
# 에이전트 시작 (아직 실행 중이 아닌 경우)
eval "$(ssh-agent -s)"
# 에이전트에 키 추가
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_web # 특정 키의 경우
ssh-agent는 ~/.ssh/config에서 ForwardAgent yes를 사용할 때 중요하며, 점프 호스트에 개인 키를 배치하지 않고도 로컬 키를 사용하여 점프 호스트에서 후속 서버로 인증할 수 있게 해줍니다.
영구 SSH 연결 (ControlMaster)
더 빠른 연결과 오버헤드 감소를 위해 ~/.ssh/config의 ControlMaster는 여러 SSH 세션이 단일 네트워크 연결을 공유할 수 있도록 합니다.
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%r@%h:%p
ControlPersist 4h
이 구성은 첫 번째 연결에 대한 제어 소켓을 생성하고(ControlMaster auto) 동일한 호스트에 대한 후속 연결은 이 소켓을 최대 4시간 동안 재사용합니다(ControlPersist 4h).
SSH 문제 해결
- 권한 거부: 개인 키(
chmod 600 ~/.ssh/id_rsa), 공개 키(chmod 644 ~/.ssh/id_rsa.pub) 및.ssh디렉터리(chmod 700 ~/.ssh)의 파일 권한을 확인하십시오. 서버에서는~/.ssh/authorized_keys가chmod 600이고~/.ssh가chmod 700인지 확인하십시오. - 연결 시간 초과: 서버가 다운되었거나, 방화벽이 22번 포트(또는 사용자 지정 포트)를 차단하고 있거나, IP 주소가 잘못되었을 수 있습니다.
- 자세한 출력:
ssh와 함께-v,-vv또는-vvv플래그를 사용하여 자세한 디버깅 정보를 확인하십시오.
bash ssh -vvv [email protected]
결론
SSH는 시스템 관리자에게 필수적인 도구로, 안전하고 효율적인 원격 접근, 명령 실행 및 파일 전송 기능을 제공합니다. 이 문서에서 논의된 명령과 기술(기본 연결 및 키 기반 인증에서 고급 터널링 및 구성 관리에 이르기까지)을 마스터함으로써 생산성을 크게 향상하고 서버 인프라의 보안을 유지할 수 있습니다.
SSH 구성을 정기적으로 검토하고, 키 기반 인증을 활용하며, ~/.ssh/config 및 ssh-agent와 같은 강력한 기능을 활용하여 일상 업무를 간소화하십시오. 이러한 필수 SSH 명령을 손쉽게 사용할 수 있다면 원격 시스템을 자신감 있고 정확하게 관리할 수 있습니다. 지속적으로 연습하고 광범위한 기능을 탐색하여 관리 업무에서 훨씬 더 큰 효율성을 발휘하십시오.