ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Open SSH
    Technique/LPIC 2019. 11. 13. 14:45
    반응형

    SSH ( Secure Shell ) 은 리모트 호스트 간의 통신에 높은 세큐리티를 실현해 주는 것이다. 강력한 인증 기능과 암호화에 의해 파일 전송이나 리모트 조작을 안전하게 행할 수 있다. 예를 들어 telnet을 사용할 경우 통신 내용은 플레인 텍스트 ( 평문 ) 이기에 통신 경로를 읽힐 경우 아카운트 정보나 패스워드가 밝혀질 가능성이 높다. ssh에는 경로를 따라가는 데이터가 암호화되어 있기에 안전성이 높아진다. Linux에서는 OpenBSD 그룹에 의해 SSH의 실체인 OpenSSH가 일반적으로 사용되고 있다. SSH에는 현재 버전 1 계열과 버전 2 계열이 있으며,  공개키 암호방식의 인정 알고리즘에 차이가 있다. 버전 1 계열에는 RSA1이 버전 2 계열에는 DSA 또는 RSA가 사용된다. 각각의 프로토콜에 호환성은 없지만 OpenSSH에는 양방의 프로토콜이 대응하고 있다.

     

    SSH의 인스톨과 설정

    OpenSSH는 대부분의 디스트리뷰션에 패키지가 준비되어 있다. Debian GNU/Linux 에는 openssh-client와 openssh-server 패키지를, Red Hat 계열의 디스트리뷰션에는 openssh, openssh-server, openssh-client와 같은 패키지를 설치한다.

    OpenSSH를 설치하면 호스트의 공개키와 비밀키가 작성된다. 이것들의 파일은 호스트 인증에 사용된다. 비밀키는 외부에 결코 노출되어선 안되도록 관리해야한다.

     

     

    호스트의 공개키와 비밀키

    파일명 설명
    ssh_host_key 비밀키 ( 버전 1 용 )
    ssh_host_dsa_key 비밀키 ( 버전 2, DSA 용 )
    ssh_host_ras_key 비밀키 ( 버전 2, RSA 용)
    ssh_host_key.pub 공개키 ( 버전 1 용 )
    ssh_host_dsa_key.pub 공개키 ( 버전2, DSA 용 )
    ssh_host_rsa_key.pub 공개키 ( 버전2, RSA용 )

     

    SSH 서버의 기능은 sshd 데몬이 제공된다. sshd의 설정 파일은 /etc/ssh/sshd_config이다

     

    /etc/ssh/sshd_config 파일의 주된 설정 항목

    설정 항목 설명
    Port SSH에서 사용하는 포트 번호 ( 기본 22 )
    Protocol SSH의 버전 ( 1, 또는 2 )
    HostKey 호스트의 비밀키 파일
    PermitRootLogin root의 로그인을 허가할지 말지
    RSAAuthentication SSH버전 1로 공개키인증을 사용할지 말지
    PubkeyAuthentication SSH 버전 2로 공개키 인증을 사용할지 말지
    AuthorizedKeysFile 공개키가 저장되어 있는 파일 명
    PermitEmptyPasswords 빈 패스워드를 허가할지 말지
    PasswordAuthentication 패스워드 인증을 허가할지 말지
    X11Forwarding X11 전송을 허가할지 말지

     

    sshd를 기동 하기 위해선 기동 스크립트를 사용한다. SysVinit를 채용한 Red Hat 계열의 디스트리뷰션에는 아래와 같다.

     

    /etc/init.d/sshd start

     

    SysVinit를 채용한 Debian 계열의 디스트리뷰션에선 아래와 같다.

     

    /etc/ini.d/ssh start

     

    systemd를 채용한 디스트리뷰션에선 아래와 같다.

     

    systemctl start sshd.service

     

    ssh를 사용하여 리조트 호스트에 로그인하기 위해선 ssh 커맨드를 사용한다. 인수에는 호스트명 또는 IP 주소를 지정한다.

     

    ssh [[ 로그인 유저 @] 호스트]

     

    유저명을 지정할 경우 지정된 유저로서 ssh에 접속한다.

    telnet과 비교하면 통신 경로가 암호화되어 있기에 추적에 대해 안전성이 높다. 또한 호스트 인증을 사용하여 접속처 호스트의 정당성을 확인 가능한 점, 유저 인증에 공개 키인증을 사용하는 점도 세큐리티면에서 높은 장점을 가지고 있다.

     

    호스트 인증

    SSH에는 유저명과 패스워드에 의해 유저 인증이 우선되며 클라이언트가 서버의 정당성을 확인하는 호스트 인증이 이루어진다. SSH로 접속할 때마다 서버 고유의 호스트 인증 ( 공개키 )이 서버로부터 클라이언트에 보내어져 클라이언트 측에 보관되어 있는 서버의 공개키와 비교하여 일치하는지 어떤지 확인한다.

     

    하지만 처음 접속 시에 한정하여 접속처 서버의 공개키를 가지고 있지 않을 경우 비교할 방법이 없다. 때문에 접속처 호스트가 등록되어 있지 않다 등과 같은 메시지를 화면에 표시한다.

     

    이 화면에서 yes를 입력하면 서버의 공개키가 /. ssh/known_hosts 파일에 등록된다.

    다음 접속할 시에는 이 메시지는 표시되지 않는다 혹시 나쁜 의도를 가진 사용자가 정당한 호스트인 행세를 한다면 가짜 서버의 인증키 (호스트 키)는 실제 서버의 호스트 키와 다르기 때문에 경고가 표시된다. 거짓된 잘못된 서버에 접속되기 전에 이상함을 알아차릴 것이다.

     

    가짜 서버로 부터의 접속

     

    호스트의 공개키가 known_hosts 파일에 저장되어있는 키와 다를 경우에는 다음과 같은 메시지가 표시된다.

    $ssh sv3.example.com
    
    key_from_blo: remaining bytes in key blob 81
    key_read : type mismatch : encoding error
    key_from_blog:remaining bytes in key blob 81
    key_read : type mismatch : encoding error
    The authenticity of host 'sv3.example.com' cna't be established. 
    ECDSA key fingerprit is XXXXX
    Are you sure you want to continue connectiong

     

    공개키 인증

    유저 인증에는 패스워드 인증 이외에 공개 키인증을 이용하는 것이 가능하다. 공개 키인증에는 통신을 행할 호스트 사이에 한쌍의 공개키와 비밀키의 페어를 이용한 인증을 행한다. 공개키 인증을 행할 때에는 새롭게 클라이언트의 공개키를 사버에 등록해둘 필요가 있다.

     

     

    공개키와 비밀키의 키 페어를 작성하기 위해서는 ssh-kegen 커맨드를 이용한다.

     

    ssh-keygen [옵션]

     

    옵션 설명
    -t 타입 암호화 타입을 지정한다. 타입은 아래와 같다 
        rsa1 : RSA ( SSH 버전 1 )
        rsa   : RSA ( SSH 버전 2 )
        dsa  : DSA ( SSH 버전 2 )
    -p 패스플레이즈를 변경한다
    -f 파일명 열쇠 파일을 지정한다
    -R 호스트 명 지정된 호스트의 열쇠를 known_hosts파일로부터 삭제한다

     

    패스 플레이즈란 비밀키를 이용하는 등의 인증용 문자열이다. 패스 플레이즈에는 문자수의 제한이 없기 때문에 패스워드보다 더 긴 문자열을 입력할 수 있다.( 문자열의 길이가 길수록 세큐리티 면에서 강력하다 ) 작성된 키 파일의 명칭은 아래와 같다.

     

    버전 비밀키 공개키
    버전1 identity identitiy.pub
    버전2 (DSA) id_dsa id_dsa.pub
    버저2( RSA)  id_rsa id_rsa.pub

    이렇게 작성한 키 안에서 공개키를 접속처 서버에 등록한다. 구체적으로는 ~/. ssh/authorized_keys 파일에 추가한다. 우선은 scp 커맨드를 사용하여 서 버츠 게 ㅇ키 파일을 전송한다. scp 커맨드는 ssh를 사용하여 안전히 파일을 전송하는 커맨드이다.

     

     

    SSH의 활용

    scp 커맨드에 의한 리모트 파일 복사

    scp 커맨드는 SSH의 방법을 이용하여 호스트 간 안전하게 파일을 복사하는 커맨드이다.

     

    scp 복사 대상 파일명 [유저명@] 복사할 호스트 : [ 복사된 파일의 위치, 명 ]
    scp [유저명@]복사 대상 포스트: 복사대상 파일명  복사 뒤 파일명

     

    옵션 설명
    -p 권한등을 보유한채로 복사
    -r 디렉토리 안에 재귀적인 복사를 행함

    최초의 서식은 로컬 호스트에 있는 파일을 리모트 호스트에 복사하는 경우이다. 그다음 서식은 리모트 호스트에 있는 파일을 로컬 호스트에 복사하는 경우이다.

     

     

    ssh-agent 

    비밀키 파일을 사용하는 경우 패스 플레이즈를 묻는다. 패스 플레이즈를 입력하는 귀찮음을 해결하기 위해서 ssh-agent를 사용한다. ssh-agent는 클라이언트 측에서 가동하는 데몬이며, 비 미리를 메모리상에 보관하여 필요한 지점에 그것을 이용하기 때문에 패스 플레이즈를 입력할 필요가 없다. ssh-agent를 이용하기 위해서는 ssh-agent의 자식 프로세스로서 bash 쉘을 기동 한다.

     

    ssh-agent bash

     

    그다음 ssh-add 커맨드를 이용하여 비밀키를 등록한다. 이 경우 패스 패스 플레이즈를 입력한다.

     

    ssh-add

     

    이후 해당 bash 쉘 이후의 자식 프로세스에서는 패스 플레이즈의 입력이 불필요하다. ssh-agent가 보관 더오 있는 비밀키의 리스트는 ssh-add -ㅣ 커맨드로 확인 가능하다.

     

    포트 전송

    SSH 포트 전송 ( 포트 포워딩 ) 이란 어떤 포트에 보내어진 TCP 패킷을 SSH를 이용하여 안전한 통신로를 경유하여 리모트 호스트의 임의의 포트에 전송하는 것이다. 이 기능을 이용하면 POP3나 FTP 등 암호화되지 않은 프로토콜을 이용한 통신의 안전성을 높일 수 있다.

     

    포트 전송을 행할 시 ssh의 서식은 아래와 같다.

     

    ssh -L [로컬 포트]:[리모트 호스트]:[리모트 포트] [리모트 호스트의 유저명]@[리모트 호스트]

     

    -f는 백그라운드에서 실행하기 위한 옵션, -N은 전송만 지시하는 옵션이다. 

    또한 포트 전송의 방법을 이용하여 리모트 호스트의 X 클라이언트를 로컬 호스트에서 동작시키는 것을 X11 포트 전송이라고 한다. X11 포트 전송을 유효히 하기 위해서는  /etc/ssh/sshd_config에 아래의 설정을 할 필요가 있다.

     

    /etc/ssh/sshd_config
    X11 Forwarding yes

     

    그 후 리모트 호스트의 호스트명을 지정하여 다음의 커맨드를 실행한다.

     

    ssh -X remote.example.net

     

    반응형

    'Technique > LPIC' 카테고리의 다른 글

    101 시험전 체크 리스트  (0) 2019.11.13
    GnuPG에 의한 암호화  (0) 2019.11.13
    유저에 관한 세큐리티 관리  (0) 2019.11.11
    호스트 레벨의 세큐리티  (0) 2019.11.11
    DNS 설정  (0) 2019.11.11

    댓글

Designed by Tistory.