Contents
(Linux)리눅스 ssh 접속, 키페어 인증
   2022년07월19일     7분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] 키 페어를 통해 ssh 인증 진행 후 접속해 보자!

원격지에 있는 서버로 접속 (sshd 접속 실습)

원격지에 있는 서버로 접속하는 방법

  1. CLI로 접속하기
    • telnet(보안적인 문제로 한물 감), ssh(요즘 사용)
  2. GUI로 접속하기
    • VNC(꽤많이쓰임), SPICE, PCoIP


  • ssh
    • 서버에 대한 인증, 사용자에 대한 인증
    • password 인증 방식, key-pair 인증 방식(추천) 이 있다


  • 실습 시나리오
    • 우리는 centos7이라는 인스턴스를 생성했다
    • 주소는 211.183.3.201이고, ec2-user가 만들어져 있다
    • 해당 계정은 wheel 그룹에 포함되어 있으므로 sudo를 이용하면 필요할 때마다 루트의 권한을 불러와서 실행할 수 있다
    • public key는 인스턴스에 위치하고 있고, private key는 윈도우에서 보관하며 접속할 계획인다



실습을 위한 사전 작업

1 . 헷갈리지 않도록 서비스명 변경하기

  • 현재 서버의 이름을 변경한다
    • /etc/hostname의 내용이 변경되는 것임
    • 재부팅 혹은 재로그인 (su) 필요서비스명 변경하기**
[root@dblab ~]# hostnamectl set-hostname srv8
[root@dblab ~]# su
[root@srv8 ~]#

[root@websrv ~]# hostnamectl set-hostname srv7
[root@websrv ~]# su
[root@srv7 ~]#


2 . 서버의 이름과 IP 등록하기

[root@srv7 ~]# cat <<EOF >>/etc/hosts
> 211.183.3.201  centos8
> 211.183.3.111  centos7
> EOF

[root@srv8 ~]# cat <<EOF >>/etc/hosts
> 211.183.3.201  centos8
> 211.183.3.111  centos7
> EOF

테스트
[root@srv7 etc]# ping -c 3 centos7
[root@srv8 etc]# ping -c 3 centos7
[root@srv7 etc]# ping -c 3 centos8
[root@srv8 etc]# ping -c 3 centos8


3 . nslookup?

  • nslookup 명령어
    • DNS서버에 Query하여 지정한 도메인의 IP 주소를 확인할 수 있다(서버의 IP)
[root@srv7 etc]# nslookup
> server
Default server: 8.8.8.8
Address: 8.8.8.8#53
> www.naver.com
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
www.naver.com	canonical name = www.naver.com.nheos.com.
www.naver.com.nheos.com	canonical name = www.naver.com.edgekey.net.
www.naver.com.edgekey.net	canonical name = e6030.a.akamaiedge.net.
Name:	e6030.a.akamaiedge.net
Address: 23.196.172.185
  • 53: 포트 번호
    • 참고) 일반적인 DNS 서버는 UDP/53에서 서비스한다 (TCP/53에서 제공하기도 함)
  • naver.com 의 IP가 무엇인지 UDP로 물어 본다
    • canonical name(별칭)
  • 일반적으로 도메인에 대한 iP 정보는 type A로 보인다
    • www.test.com A 1.1.1.1
  • 여러 서버가 하나의 도메인을 활용하는 경우 CNAME을 사용하여 (별칭을)구성한다



sshd 접속 실습

  • sshd(Secure Shell Daemon)
    • 인증된 종단 간 암호화된 네트워크 통신을 제공하는 Linux용 OpenSSH 구현의 일부
    • 공유 키 정보 교환과 같은 대체 인증 기술을 사용하도록 sshd 서비스를 구성할 수 있기 때문에 한 호스트의 사용자는 암호를 사용하지 않고 다른 시스템에 로그인할 수 있다


1 . IP 점검

  • 네트워크 관련 명령들
    1. IP 확인
      • ifconfig ens32
      • ip addr list
      • ip addr show
        • yum -y install net-tools
    2. 리눅스의 라우팅 테이블 확인
      • ip route
      • netstat -nr
ipaddr show
ping google.com -c 3
  • ip주소가 정상적임에도 외부와 통신이 되지 않는다면
    • ifdown ens32 ; ifup ens32
    • (vmware 문제일 수 있으므로 윈도우 네트워크 설정에서 다음을 비활성화-활성화)
    • img_9
    • [root@srv7 0720]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 에서 네트워크 상태를 확인할 수 있다
    • 참고) 현재 실습 네트워크 구성은 다음과 같다
      img_21


  • ifdown, ifip
    • 인터페이스 비활성화 / 활성화
    • 활성화 될 때에는 인터페이스의 구성 파일을 읽고 실행된다.
    • 따라서 IP 주소 등을 변경했을 때에는 systemctl restart network 를 이용하거나 특정 인ㅌ페이스를 down > up 하여 활성화하면 변경사항을 적용시킬 수 있다


2 . ssh 서비스 동작 상태 확인하기

[root@srv7 0720]# systemctl restart sshd
[root@srv7 0720]# systemctl status sshd
● sshd.service - OpenSSH server daemon


3 . ssh를 위한 설정 파일 확인하기

[root@srv7 0720]# gedit /etc/ssh/sshd_config
---
#Port 22                                    보안을 생각한다면 포트 번호를 변경하자
AuthorizedKeysFile	.ssh/authorized_keys    Public Key를 등록해두는 파일명과 경로 지정
#PermitRootLogin yes                        Root로 로그인 허용한다는 옵션 - 보안을 위해 no로 설정
PubkeyAuthentication yes                    사용자 인증을 할 때 키를 통한 로그인을 허용하겠다 - 서버는 pub키 있는데 클라의 private 키가 매치되면 로그인
PasswordAuthentication no                   패스워드 인증을 허용한다는 옵션 - 보안을 위해 no로 설정
#MaxSessions 10                             한 번에 최대 접속할 수 있는 사람들
  • 설정값 적용을 위해 재실행한다
  • 서비스 실행시 오류가 발생한다면 트래킹 해야지
    • systemctl status sshd
    • journalctl -b sshd


4 . 계정 생성하기

[root@srv7 0720]# useradd ec2-user
[root@srv7 0720]# passwd ec2-user
[root@srv7 0720]# su ec2-user
[ec2-user@srv7 0720]$ cd
[ec2-user@srv7 ~]$


5 . Key-pair 만들기

  • 추가적인 기능을 만들지 않은 ‘키’만 만들겠다
  • 개인키와 공개키가 생성됨
[ec2-user@srv7 ~]$ ssh-keygen -q -f ~/.ssh/0720.pem -N ""
[ec2-user@srv7 .ssh]$ ls
0720.pem  0720.pem.pub


  • 공개키는 authorized_keys 파일로 저장한다
[ec2-user@srv7 .ssh]$ cat 0720.pem.pub > authorized_keys
[ec2-user@srv7 .ssh]$ head -1 authorized_keys
  • 개인키 (0720.pem)는 복사하여 윈도우에 붙여넣는다
[ec2-user@srv7 .ssh]$ head -1 authorized_keys
[ec2-user@srv7 .ssh]$ cat 0720.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA08AdaQTuZhYLnqZ1B5+8eF1ZhOq3NCm/WijDSLhOpakvUS1Z
이 키를 복사
  • img_10


6 . 사용자 sudo 권한 설정

  • ec2-user 사용자는 현재 인스턴스 내에서 sudo를 사용하여 root의 권한으로 명령을 실행할 수 있어야 한다
  • 해당 사용자를 wheel 그룹에 집어 넣어야 함
[ec2-user@srv7 .ssh]$ exit
exit
[root@srv7 0720]# gedit /etc/sudoers
--- 107번째 줄
## Allows people in group wheel to run all commands (wheel 그룹 사용자들은 루트 권한 가능하나, sudo 명령시 패스워드를 요구받는다, 귀찮다)
# %wheel	ALL=(ALL)	ALL

## Same thing without a password (패스워드를 요구하지 않고 루트 권한 명령이 가능하다)
%wheel	ALL=(ALL)	NOPASSWD: ALL
  • 그룹 모드 변경하기
    • a: 기존 그룹은 그대로 유지하겠다(append)
    • G: 그룹에 ‘추가’시키겠다
    • 즉, 기존 그룹은 유지하면서 새로운 그룹 wheel에 포함시키겠다
[root@srv7 0720]# usermod -aG wheel ec2-user


7 . 키 permission 조정하기

[root@srv7 .ssh]# cd /home/ec2-user/.ssh
[root@srv7 .ssh]# ls -al
total 12
drwx------. 2 ec2-user ec2-user   65 Jul 20 10:48 .
drwx------. 6 ec2-user ec2-user  140 Jul 20 10:51 ..
-rw-------. 1 ec2-user ec2-user 1675 Jul 20 10:46 0720.pem
-rw-r--r--. 1 ec2-user ec2-user  395 Jul 20 10:46 0720.pem.pub
-rw-rw-r--. 1 ec2-user ec2-user  395 Jul 20 10:48 authorized_keys
[root@srv7 .ssh]# chmod 644 authorized_keys


8-1. 클라이언트에서 접속하기(윈도우 접속)

  • pem 파일을 putty 를 통해 접속해야 한다 (키 변환 필요)
  • 키를 클라이언트로 복붙한다(복붙할 때 창 크기에 의한 공백 주의)
  • 키 변환하기
    • img_11
    • save private key로 ppk 파일로 변환한다
    • img_12
  • putty 실행
    • img_13
    • img_14
    • img_15
  • 결과
    • img_16


8-2. 클라이언트에서 접속하기(리눅스)

  • 로그인 과정으로 접속이 가능하지만, 비추천(대칭키)
  • 키페어를 통한 인증 추천함


  • 5번 과정에서 진행한 키페어를 클라이언트측에 복붙한다(복붙할 때 창 크기에 의한 공백 주의)
    • 클라이언트측 비밀키 권한도 설정해야 함
    • img_7
    • 접속 시 잘 인증되며, 접속이 될 것임
[root@srv8 ~]# touch testkey.pem
[root@srv8 ~]# gedit testkey.pem                만들어 둔 비밀 키를 복붙한다
[root@srv8 ~]# chmod 600 testkey.pem
[root@srv8 ~]# ssh -i testkey.pem centos7


실제 환경이라면 관리서버에서 key-pair를 만든다

  • 관리자는 private key를 갖는다
  • public key는 내가 관리하고자 하는 다수의 서버에 등록시킨다


9. 서버의 공개키(공통, 리눅스로 실습)

  • 클라이언트에서는 아직 연결이 되지 않았는데, 키를 저장할 것인지 물어본다
    • 해당 키는 서버가 위변조되었는지 기억하는 용도로만 사용(퍼블릭 키는 인터넷에 돌아다녀도 아무 문제가 없음)
    • img_6
[root@srv8 ~]# ssh -l root centos7
The authenticity of host 'centos7 (211.183.3.111)' can't be established.
ECDSA key fingerprint is SHA256:4jOHuaa8dH7Vxyb8InbRIDAw7qEtNRD46LqHi5r2TcE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? ^C


  • 로그인 성공, 다만 키를 매번 저장할 것인지 물어보는 것은 번거롭다
    • 키를 직접 긁어 온다(known-hosts에 저장함)
    • 이제 서버의 공개키 저장여부를 물어보지 않는다
[root@srv8 ~]# ssh-keyscan centos7 > .ssh/known_hosts
# centos7:22 SSH-2.0-OpenSSH_8.0
# centos7:22 SSH-2.0-OpenSSH_8.0
# centos7:22 SSH-2.0-OpenSSH_8.0
  • 여러 곳의 서버의 퍼블릭 키를 모으는 것이 더 쉬워 졌다
    • for 문을 돌려서 ssh-keyscan centos7 » .ssh/known_hosts 키를 쓸어와서 추가할 수 있다



SSH 인증과정 총 정리

  1. 서버 인증
    • 클라이언트가 서버를 인증하는 것
    • 공개키(대칭키)
  2. 사용자 인증
    • 서버가 정상적인 사용자인지 여부를 확인한다
    • 키페어를 사용할 경우: (비대칭키), 공개키(서버) + 비밀키(클라이언트)
    • 패스워드를 사용할 경우: (대칭키), 비밀키


  • 그렇다면 Data Center에서 우리가 해야 할 일은?
  • img_20
  • (키는 client, server 어느 쪽에서 생성해도 상관 없음)


전체적인 과정을 정리하면 다음과 같다

  1. 템플릿 이미지를 준비한다
    • 클라우드용 이미지(OS) - 템플릿만 제공한다(접속할 수 있는 방법은 없음)
    • PW(대칭키) 가 아닌, key-pair(비대칭키)를 사용하도록 해야 함

  2. 이미지 수정하기
    • public key 인증 활성화
    • 사용할 계정을 미리 만들어 두기

  3. key-pair 만든다
    • 이미지(템플릿)에서 만들어야 하는가? NO!
    • bastion host(관리용 서버)에서 만든다

  4. public-key를 기본 이미지에 추가적으로 부착한다
    • virt-customize a test.qcow2 –root password:test123
    • 기본 이미지의 루트 패스워드를 test123으로 한다
    • virt-customize a test.qcow2 –upload mykey.pem.pub:/root/.ssh/authorized_keys
    • 기본 이미지에 키를 저장한다

  5. private-key는 사용자에게 보여준다 (혹은 다운로드 해 준다)
    • 이후 private-key는 삭제한다
    • pub 인스턴스, pri 사용자에게 넘어간 상태

  6. 템플릿 이미지를 인스턴스로 실행한다
    • 인스턴스는 퍼블릭 키를 가지고 있고
    • 사용자는 비공개 키를 가지고 있다

  7. 생성된 인스턴스의 정보는 DB에 저장한다
    • 인스턴스의 IP, CPU, RAM, HOST(zone)

  8. 사용자는 관리페이지에서 IP를 확인하고 접속한다
    • ssh -i mykey.pem [IP주소]
    • 혹은 ppk 파일을 putty와 연결하여 접속


  • 실전에서는, 키 페어를 이미지에 저장하지 않는다
  • img_33
  • 인스턴슬르 생성하는 과정에서 키 페어를 생성한다