Search
Duplicate
📒

[Linux CLI] 05-3. SSH(Secure Shell)

상태
수정중
수업
Linux
주제
연관 노트
3 more properties
참고

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 이상의 파일도 전송가능 (대용량 전송이 가능)
세션 유지
파일 전송 취소시 세션을 취소해야함
파일 전송 취소시 세션을 유지할 수 있음
전송 재개 가능
전송 재개 불가능
전송 재개 가능