Linux

[Linux] 시스템 보안 관리 - ssh(Secure Shell)

thdwldud 2025. 10. 16. 09:33

ssh(Secure Shell)

1. ssh의 개요

  • ssh는 원격 시스템에 로그인하여 명령을 실행하는 프로그램
  • 기본적인 사용법은 telnet과 유사
  • telnet은 클라이언트와 서버 간의 데이터 전송 시에 일반 텍스트 형태로 패킷을 전달하여 패킷의 내용을 유출당할 수 있지만, ssh는 패킷 전송 시 암호화시키므로 안전하게 전송할 수 있음
  • ssh는 ssh2와 ssh1 두버전이 있는데 ssh2는 ssh1을 개선한 것으로 호환은 되지만 기본적으로 호환성을 포함하고 있는 것이 아니므로 ssh1을 지원하려면 ssh1 서버 같이 운영해야 함
  • SSH2는 이중-암호화 RSA 키 교환을 비롯하여 다양한 키-교환 방법을 지원

2. ssh의 특징

  • 패킷을 암호화하여 다른 원격 로그인 프로그램인 telnet이나 rlogin에 비해 안전
  • rlogin처럼 패스워드 입력 없이 로그인할 수 있음
  • rsh처럼 원격 셸을 지원
  • 원격 복사(scp)을 지원
  • 안전한 파일 전송(sftp)을 지원

3. ssh 설치

  • 리눅스에서는 ssh의 공개 버전인 openssh를 사용
  • SSH 서버와 SSH 클라이언트 프로그램으로 나누어져 있음
  • 레드햇 계열 리눅스에서는 3개의 패키지로 구분해서 배포하고 있음
패키지명 설명
openssh openssh서버와 openssh 클라이언트에 모두 필요한 핵심적인 파일들이 들어있는 패키지로 ssh-keygen 명령이 들어있음
openssh-server openssh 서버 관련 패키지로 데몬인 sshd, sftp 서버 등이 들어있음
openssh-clients openssh 클라이언트 관련 패키지로 ssh, scp, sftp 등의 명령어가 들어있음

4. ssh 서버 설정

  • ssh 서버의 환경 설정 파일 : /etc/ssh/sshd_config 
  • 실행 명령 : systemctl start sshd.service

[sshd_config 파일의 주요 항목]

  • Port 22
    • ssh 서버가 사용하는 포트를 지정
  • #AddressFamily any
    • 접속하는 IP 주소 버전을 지정하는 옵션으로 any는 IPv4와 IPv6 주소 체계 모두 접속이 가능
    • 앞에 있는 주석을 제거하고 any 대신에 inet이라고 설정하면 IPv4 주소만 접속 가능하고 inet6라고 설정하면 IPv6 주소만 접속이 가능
  • #ListenAddress 0.0.0.0
  • #ListenAddress ::
    • sshd 데몬이 허가하는 주소를 설정하는 영역으로 여러 개의 네트워크 인터페이스가 있을 경우 IP 대역과 포트를 지정할 수 있음
    • “ListenAddress 192.168.1.1:22” 형태로 지정하고, 콜론(:)은 IPv6 주소 체계에서 사용하면 됨
  • Protocol 2
    • ssh 프로토콜의 버전을 지정
  • HostKey /etc/ssh/ssh_host_key
    • SSH1의 호스트키 위치를 지정
  • SyslogFacility AUTHPRIV
    • syslog 관련하여 facility를 지정하는 항목으로 ssh를 통한 접속은 AUTHPRIV로 처리하여 기록
  • PermitRootLogin yes
    • root 사용자의 로그인 허용 여부를 결정
    • yes는 root로 접속이 가능하다는 의미로 보안을 강화하기 위해서는 no로 바꿈
  • AuthorizedKeysFile .ssh/authorized_keys
    • 클라이언트에서 생성한 공개키를 저장할 파일명을 설정
  • PasswordAuthentication yes
    • 패스워드를 이용한 인증을 허용
    • 기본 값이 yes

5. ssh 클라이언트 명령어 : ssh

  • openssh-clients 패키지를 설치하면 ssh 명령을 이용해서 접속할 수 있고, 윈도우에는 SecureCRT, Xshell 등과 같은 프로그램을 이용해야 함
# ssh는 서버로 접속할 때에 같은 계정으로 접속을 시도하므로 클라이언트와 서버의 계정이 같으면 생략해도 됨
ssh [option] 호스트명 or IP_주소

# -l 옵션 대신에 사용하는 방법으로 클라이언트 계정과 서버의 계정이 다르면 계정 이름을 명기해야 함
ssh 계정이름@호스트네임

# rsh와 같이 원격 셸을 사용할 수 있는데, 접속없이 명령만 내릴 때 유용
ssh 호스트네임 명령

옵션

옵션 설명
-l 다른 계정으로 접속할 때 사용 이 옵션 대신 서버 주소 앞에 @를 붙여 사용할 수 있음
-p ssh 서버의 포트가 22번이 아닌 경우 -p 옵션을 사용해서 바뀐 포트를 지정할 때 사용

사용 예

  • 192.168.56.124 서버로 클라이언트의 계정과 같은 posein으로 접속을 시도. 처음 접속하는 경우에는 관련 키 생성을 위해 yes라고 입력하고 원격지 서버의 패스워드를 입력하면 접속됨
[posein@www ~]$ ssh 192.16856.124
  • 192.168.1.1 서버로 클라이언트의 계정과 다른 계정인 yuloje로 접속을 시도
[posein@www ~]$ ssh -l yuloje 192.168.1.1
  • 192.168.1.1 서버에 yuloje라는 계정으로 접속을 시도
[posein@www ~]$ ssh yuloje@192.168.1.1
  • 192.168.1. 서버의 ssh 포트 번호가 180번인 경우에 사용
[posein@www ~]$ ssh -p 180 192.168.1.1
  • 원격에서 posein.org에 yuloje라는 계정으로 접속하여 data 라는 디렉터리를 생성
[posein@www ~]$ ssh -l yuloje posein.org makedir data

6. 인증키를 이용한 SSH 서버 접속 : ssh-keygen

  • SSH 서버를 접속할 때 패스워드를 입력하여 접속하지만, 별도의 인증키를 이용하여 접속할 수 있음
  • SSH 클라이언트에서 ssh-keygen 명령을 이용해서 비밀키와 공개키를 생성하고, SSH 서버에 공개키를 복사하면 됨

ssk-keygen [option]

옵션

옵션 설명
-t 사용할 암호화 알고리즘을 지정하는 옵션으로 rsa, dsa 등을 사용할 수 있음
ssh2 버전에서는 지정하지 않으면 rsa를 사용

사용 예

  • DSA를 이용해서 인증키를 생성
ssh-keygen -t dsa
  • 기본적으로 RSA를 이용해서 인증키를 생성. id_rsa와 id_rsa.pub 두개의 파일이 생성되며, 패스워드를 별도로 설정하지 않으면 서버에 접속할 때 패스워드 없이 로그인 가능. 생성된 파일 중에 공개키 파일에 해당하는 id_rsa.pub 파일을 원격지 서버의 홈 디렉터리 안에 .ssh/authorized_keys로 복사하면됨
ssh-keygen

 

💡 원격 셸 및 scp를 이용해서 작업

1. 원격지에 .ssh 디렉터리를 생성하고 scp를 이용해서 공개키를 복사
ssh 192.168.56.124 mkdir -m 700 .ssh
scp .ssh/id_rsa.pub 192.168.56.124:.ssh/authorized_keys​

2. ssh 명령으로 접속
ssh 192.168.56.124​

 

7. 원격지 공개키 복사 : ssh-copy-id

  • ssh-keygen으로 생성된 공개키 파일 (ex. id_rsa.pub)을 원격지 서버의 홈 디렉터리 내에 인증키 파일로 복사하는 명령
  • 관련 파일인 authorized_keys 파일이 존재하지 않는 경우에는 생성하고, 존재하는 경우에는 관련 정보만 출력
ssh-copy-id [option] 공개키_파일 원격지_주소

옵션

옵션 설명
-i 공개키 파일을 지정할 때 사용
-f 강제로 인증키 파일을 추가
-p 기본 포트인 22번이 아닌 경우 특정 포트 번호를 지정할 때 사용

사용 예

  • IP 주소가 192.168.56.122번인 원격지 서버에 공개키 정보를 등록
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.56.122