Open SSH

SunChan Kwon·2024년 5월 30일
0

Linux

목록 보기
10/20
post-thumbnail

시스템에 원격으로 접속하여 안전한 작업이 가능하다.
기존의 telnet, rsh 등은 데이터가 평문으로 전송되어 보안에 취약하기 때문에 암호화 과정을 거치는 SSH를 사용한다.

ssh 연결 과정

ssh 는 데이터 암호화 시 비대칭키 암호화와 대칭키 암호화 알고리즘을 사용

ssh 접속 시 출력되는 메시지에 yes 를 입력하면 서버의 공개키를 클라이언트에 저장하게 된다.

[ssh-user@server2 ~]$ ssh vagrant@192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ED25519 key fingerprint is SHA256:2QpFpEo/HRBeI/RlLPm9EbwtBBITXrcv1jhHUqIu1Nk.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

ssh 명령 사용

user-name에 접속하고자 하는 사용자 이름, address에 접속하려 하는 시스템의 DNS 또는 IP주소를 입력한다.

ssh <username>@address
-X 옵션 : 두 시스템 모두 GUI기반 환경일 때 그래픽 도구 사용

# 원격 명령
ssh <username>@address <command>

OpenSSH 구성파일

/etc/ssh 디렉토리에 존재한다.

파일 이름설명
moduliDiffie-Hellen 알고리즘에 사용되는 파라미터
ssh_configOpenSSH 클라이언트 설정에 필요한 파일
sshd_configOpenSSH 서버 설정에 필요한 파일
ssh_hostkeyhost와 key 사이가 대신 암호화 알고리즘 이름으로 대체, 해당 알고리즘 개인키
ssh_hostkey.pubhost와 key 사이가 암호화 알고리즘 이름으로 대체, 해당 알고리즘의 공개키

OpenSSH 키 기반 인증

키 파일 생성

# 실행 시 .ssh에 인증을 위한 개인키, 공개키 한 쌍이 생성
ssh-keygen <option> <argument>

# 키가 저장되는 위치 설정(enter 입력 시 기본값)
Enter file in which to save the key (/root/.ssh/id_rsa):

# 보조 패스워드 생성 여부(enter 입력 시 키 파일만으로 인증)
Enter passphrase (empty for no passphrase):

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:

# .ssh 디렉토리에 id_rsa, id_rsa.pub 파일 생성
[root@server1 ~]# ls .ssh
id_rsa  id_rsa.pub  known_hosts  known_hosts.old

# 상대 시스템에 key copy
ssh-copy-id <username>@<address>

# ssh-user 사용자에게 복사 후 확인
[ssh-user@server2 ~]$ ls .ssh/
authorized_keys  known_hosts  known_hosts.old

# 별도의 인증 과정 없이 키 기반 인증으로 바로 접속
[root@server1 ~]# ssh ssh-user@192.168.10.20
Last login: Fri May 31 02:19:58 2024

사용자 간 1:1로 설정이 되어있기 때문에 sshd_config에서 접근을 차단하도록 설정하면 키 기반으로 인증된 사용자만 접근 가능하다.

# ssh 접속이 불가능하도록 64번째 줄 수정
sudo vi /etc/ssh/sshd_config

PasswordAuthentication no

# 인증되지 않은 사용자인 vagrant user는 접속이 불가능 하다.
[vagrant@server1 ~]$ ssh ssh-user@192.168.10.20
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ED25519 key fingerprint is SHA256:5Oj+neREW0+5dP9Vjr1hJ9T0PDNZBszUqiE7ZS4ePM8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '192.168.10.20' (ED25519) to the list of known hosts.
ssh-user@192.168.10.20: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

파일 원격 복제

scp <source> destination
-r 옵션 : 디렉토리 복제

# ssh-server로 fileA라는 파일을 원격 복제
[root@server1 ~]# scp fileA ssh-server@192.168.10.20:/home/ssh-server/
ssh-server@192.168.10.20's password: 
fileA      100%    9    17.8KB/s   00:00

# ssh-server의 fileB라는 파일을 사용자의 현재 위치로 복제
[root@server1 ~]# scp ssh-server@192.168.10.20:/home/ssh-server/fileB .
ssh-server@192.168.10.20's password: 
[root@server1 ~]# ls
fileA  fileB

sftp 명령

ftp와 유사한 파일 전송 방식으로 ssh의 암호화 방식을 함께 사용해 좀 더 안전히 파일을 주고받을 수 있다.

sftp <username>@<address>

[root@server1 ~]# sftp ssh-server@192.168.10.20
ssh-server@192.168.10.20's password: 
Connected to 192.168.10.20.
sftp> ls
fileA  fileB  
sftp> pwd
Remote working directory: /home/ssh-server
sftp프롬프트 명령설명
ls PATH디렉토리 내용 확인
cd PATH디렉토리 이동
mkdir PATH디렉토리 생성
rmdir PATH디렉토리 제거
put LOCAL [REMOTE]클라이언트의 파일을 원격으로 전송
get REMOTE [LOCAL]원격의 파일을 클라이언트로 전송

ssh와 sftp

  • ssh는 명령어 한 줄로 원하는 명령을 실행할 수 있지만 원격지의 파일 주소 등을 알고있어야 한다.
  • sftp는 직접 명령어를 입력해 작업해야하지만 원격지의 구조를 바로 조회하여 작업이 가능하다.

ssh 연결 실습

환경

Vagrantfile

가상머신 2대를 한 파일로 생성

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
 config.vm.define "server1" do |config|
  config.vm.box = "generic/rocky9"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "1"
    vb.customize ["modifyvm", :id, "--nic2", "natnetwork", "--nat-network2", "NatNetwork"]
      (0..2).each do |hd|
        if !File.exist?("disk#{hd}.vdi") 
          vb.customize ["createmedium", "disk", "--filename", "disk#{hd}.vdi", "--size", 20480]
        end
        vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", hd+1, "--device", 0, "--type", "hdd", "--medium", "disk#{hd}.vdi"]
      end
  end
 end
 config.vm.define "server2" do |config|
  config.vm.box = "generic/rocky9"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "1"
    vb.customize ["modifyvm", :id, "--nic2", "natnetwork", "--nat-network2", "NatNetwork"]
  end
 end
end

같은 네트워크 대역을 가진 가상머신 server1과 server2의 ssh 접속 환경 구축

  • server1 : ipv4.addr : 192.168.10.10/24
  • server2 : ipv4.addr : 192.168.10.20/24

공통 환경
gateway : 102.168.10.1
dns : 8.8.8.8

가상머신 접속

vagrant ssh <정의된 가상머신 이름>

네트워크 수동 설정 과정

# 위 환경에 맞춰 nmcli 명령으로 설정
# server2 ipv4.addr : 192.168.10.20
nmcli connection add con-name static type ethernet ifname eth1 ipv4.addresses 102.16
8.10.10/24 ipv4.gateway 192.168.10.1 ipv4.dns 8.8.8.8 ipv4.method manual

nmcli connection up static

# ssh 접속이 가능하도록 64번째 줄 수정
sudo vi /etc/ssh/sshd_config

수정 PasswordAuthentication yes

# restart 하여 수정내용 적용
systemctl restart sshd

ssh 접속

ssh 명령 사용하여 다른 가상머신으로 접속

키 기반 인증

# 키 생성
ssh-keygen

# 접속할 상대방에 키 복사
ssh-copy-id <username>@<address>

결과

그림과 같이 server1, server2 가상머신이 양방향으로 통신할 수 있게 구축되었고, 키 기반 인증 활용 시 sshd_config에서 ssh 접근을 차단하더라도 키를 가지고 있으면 단방향으로 통신할 수 있게 되었다.

0개의 댓글