참고
SSH (Secure Shell)
NOTE
SSH는 네트워크에서 안전하게 데이터 전송하거나 원격 컴퓨터에 접근하기 위해 사용하는 프로토콜 입니다.
sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh
sudo systemctl enable ssh
sudo systemctl start ssh
Bash
복사
SSH 사용을 위해 OPEN SSH Server설치
SSH는 기본적으로 클라이언트-서버 모델입니다.
•
서버: SSH Daemon이 실행되며 특정 포트에서 연결을 수신합니다. 사용자가 올바른 자격 증명을 제공하면 연결을 승인하고 사용자 Session이 시작됩니다.
•
클라이언트: 사용자의 컴퓨터에 설치된 SSH 클라이언트 소프트웨어가 원격 호스트와의 통신을 담당합니다. 클라이언트는 원하는 서버의 주소, 사용자 이름, 인증 정보를 제공합니다.
SSH 인증 방법
NOTE
SSH 인증방법은 비밀번호 방식과 SSH키 방식을 사용할 수 있습니다.
비밀번호 기반 인증
비밀번호 기반 인증은 원격 시스템에 로그인할 때 사용자의 이름과 비밀번호를 제공합니다.
# SSH를 사용하여 원격 서버 로그인
ssh [username]@[remote_host]
Bash
복사
SSH키 기반 인증
SSH키 기반 인증 방식은 클라이언트 측에서 공개/비공개 키 쌍을 사용한 방법이며, 접속하기 위해서는 클라이언트의 공개키를 서버의 ~/.ssh/authorized_keys파일에 등록해야 합니다.
# RSA 키 쌍 생성 (현대적인 알고리즘을 위해 ed25519 사용 권장)
ssh-keygen -t rsa -b 4096
# 공개키를 원격 서버에 복사
ssh-copy-id -i ~/.ssh/id_rsa.pub [username]@[remote_host]
# 키를 사용하여 접속
ssh -i ~/.ssh/id_rsa [username]@[remote_host]
Bash
복사
SSH 키 인증 방식
1.
클라이언트 요청
•
클라이언트가 원격 서버에 접속하려고 시도한다.
2.
프로토콜 버전 교환
•
SSH 프로토콜의 주요 버전은 1.X와 2.X인데 대부분의 시스템이 SSH-2.0을 사용한다.
•
만약 직접 접속서버의 프로토콜 버전을 확인하고 싶다면 telnet [remote_host] 22 명령어를 사용해 접속하면 확인이 가능하다.
3.
사용자 인증
•
공개/비밀키를 사용해서 클라이언트-서버가 서로 인증된 사용자임을 검증합니다.
•
서버에서 클라이언트의 공개키가 ~/.ssh/authorized_keys에 존재하면 3~8번 과정 생략
•
클라이언트에서 서버 공개키가 ~/.ssh/known/hosts에 존재한다면 호스트키 검증 생략
4.
Diffie-Hellman(DH)키 교환 알고리즘을 사용해 대칭 세션 키를 협상
•
Diffie-Hellman(DH) 알고리즘은 비밀키의 노출없이 공유 세션키를 생성할 수 있습니다.
•
만약 서버가 클라이언트에게 알려지지 않았다면, 서버의 키 지문을 클라이언트의 known_hosts에 추가할 수 있습니다.
5.
새로운 키 생성
•
협상된 세션 키를 바탕으로 새로운 암호화 키를 생성합니다.
6.
암호화된 세션 시작
•
암호화된 세션을 통해 실제 통신이 시작되며, 서버-클라이언트간의 모든 데이터 교환은 암호화되어 보안을 유지합니다.
SSH 키 쌍 생성 및 작업(ssh-keygen)
NOTE
# 1. SSH 키 쌍 생성
ssh-keygen
ssh-keygen -b 4096 # 키 길이 지정(4096비트)
ssh-keygen -p # SSH 키 변경
ssh-keygen -l -f ~/.ssh/id_rsa # 키 지문 확인
ssh-keygen -H -F [remote_host] # 호스트 키 확인
ssh-keygen -t [rsa | ecdsa | ..] # 알고리즘 설정
ssh-keygen -y -f /path/to/key.pem > key.pub # .pem키에서 공개키 뽑아내기
# 2. 키 쌍 저장위치(기본경로 ~/.ssh/id_rsa)
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
# 3. 개인키 사용 암호설정(아무것도 입력안하면 생략됨)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
# 4. 생성완료
Output
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+
Bash
복사
ssh 명령어
NOTE
ssh [username]@[remote_host]
ssh -p 2222 [username]@[remote_host] # 포트 지정
ssh -i ~/.ssh/id_rsa [username]@[remote_host] # 특정 개인 키 파일을 사용
ssh -o StrictHostKeyChecking=no [username]@[remote_host] # 호스트 키 검증 비활성화
ssh [username]@[remote_host] 'data' # 접속 후 바로 data 명령 실행
Bash
복사
ssh 예제코드
•
호스트 키 검증은 SSH 클라이언트가 원격 서버에 처음 접속할 때 서버는 자신의 호스트 키를 클라이언트에게 제공합니다. 클라이언트는 이 키를 ~/.ssh/known_hosts 파일에 저장하여, 해당 서버에 다시 접속할 때마다 서버 정체성을 검증합니다.
•
StrictHostKeyChecking=no 옵션을 사용하면 호스트 키 검증을 비활성화해서 호스트 키의 변경이나 처음 접속하는 호스트에 대해 경고하지 않고 자동 접속을 수락합니다.
원격 서버에 로그인할때마다 옵션값을 입력하지 않으려면 ~/.ssh/config에 구성 파일을 만들거나 편집할 수 있습니다.
Host [remote_alias]
HostName [remote_host]
Port [port_num]
Bash
복사
~/.ssh/config
ssh-copy-id 명령어
NOTE
# 클라이언트 공개 키를 서버의 ~/.ssh/authorized_keys 파일에 저장한다.
ssh-copy-id [username]@[remote_host]
Bash
복사
cat ~/.ssh/id_rsa.pub
echo 공개키_내용 >> ~/.ssh/authorized_keys
Bash
복사
수동으로 추가
sshd(SSH Daemon)
NOTE
SSHD는 SSH 연결을 받아주기 위해(Inbound) 대기하는 프로세스입니다.
/etc/ssh/sshd_config # sshd 설정파일
sudo systemctl ssh restart # 설정 변경이후 재시작
Bash
복사
•
sshd_config에서 진행되는 설정으로 다른 서버에서 ssh로 접속하려 할때 허용하는 설정을 진행할 수 있다
# 비밀번호 인증 비활성화
PasswordAuthentication no
# 데몬 실행포트 변경
Port 4444
# SSH 사용자/그룹 제한
AllowUsers user1 user2
AllowGroups sshmembers
# root 접속 비활성화
PermitRootLogin no
# 특정 IP 주소에서만 SSH 연결 수신
ListenAddress 192.168.1.100
Bash
복사
scp(Secure Copy) 명령어
NOTE
SSH통신을 기반으로 파일을 전송한다.
# scp [옵션] [원본_파일] [대상_위치]
scp [username]@[remote_host]:[remote 경로] [local 경로] # Remote to Local
scp [local 경로] [username]@[remote_host]:[remote 경로] # Local to Remote
# Remote to Remote
scp [username]@[remote_host]:[remote 경로] [username]@[remote_host]:[remote 경로]
# 디렉토리 전송
scp -r [username]@[remote_host]:[remote 경로] [local 경로]
# 복사 진행상태 표시
scp -v [username]@[remote_host]:[remote 경로] [local 경로]
Bash
복사
sftp(SSH File Transfer Protocol) 명령어
NOTE
SCP와 달리 STFP를 사용하면 원격 파일에 대해서 다양한 작업을 수행하고 파일 전송이 가능하다.
# 기본 접속
sftp [username]@[remote_host]
# 특정 포트 접속
sftp -oPort=2222 [username]@[remote_host]
Bash
복사
get remotefile.txt # 서버 파일 다운로드
get -r remotedir # 서버 디렉토리 다운로드
put localfile.txt # 로컬 파일 업로드
put -r localdir # 로컬 디렉토리 업로드
Bash
복사
sftp를 활용한 파일 다운로드, 전송
SCP vs SFTP
SCP | SFTP | |
기능 | 파일 전송만 허용하는 간단한 프로토콜 | 원격 파일 관리를 위한 광범위한 작업을 제공원격으로 파일 제거, 중단 된 전송 재개 등의 추가기능을 가짐 |
플랫폼 | 대부분 Unix 플랫폼만 사용함 | 여러 플랫폼에서 사용할 수 있음 |
속도 | SFTP 보다 빠르다 | 패킷의 암호화 및 일치를 기다려야 하므로 SCP보다 느림 |
파일 전송 용량 | 4GB 이상의 파일 전송 불가 | 4GB 이상의 파일도 전송가능 (대용량 전송이 가능) |
세션 유지 | 파일 전송 취소시 세션을 취소해야함 | 파일 전송 취소시 세션을 유지할 수 있음 |
전송 재개 가능 | 전송 재개 불가능 | 전송 재개 가능 |