(Linux)리눅스 ssh 접속, 키페어 인증
[카카오 클라우드 스쿨] 키 페어를 통해 ssh 인증 진행 후 접속해 보자!
원격지에 있는 서버로 접속 (sshd 접속 실습)
원격지에 있는 서버로 접속하는 방법
- CLI로 접속하기
- telnet(보안적인 문제로 한물 감), ssh(요즘 사용)
- 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 점검
- 네트워크 관련 명령들
- IP 확인
- ifconfig ens32
- ip addr list
- ip addr show
- yum -y install net-tools
- 리눅스의 라우팅 테이블 확인
- ip route
- netstat -nr
- IP 확인
ipaddr show
ping google.com -c 3
- ip주소가 정상적임에도 외부와 통신이 되지 않는다면
- ifdown ens32 ; ifup ens32
- (vmware 문제일 수 있으므로 윈도우 네트워크 설정에서 다음을 비활성화-활성화)
- [root@srv7 0720]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 에서 네트워크 상태를 확인할 수 있다
- 참고) 현재 실습 네트워크 구성은 다음과 같다
- 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
이 키를 복사
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 를 통해 접속해야 한다 (키 변환 필요)
- 키를 클라이언트로 복붙한다(복붙할 때 창 크기에 의한 공백 주의)
- 키 변환하기
- save private key로 ppk 파일로 변환한다
- putty 실행
- 결과
8-2. 클라이언트에서 접속하기(리눅스)
- 로그인 과정으로 접속이 가능하지만, 비추천(대칭키)
- 키페어를 통한 인증 추천함
- 5번 과정에서 진행한 키페어를 클라이언트측에 복붙한다(복붙할 때 창 크기에 의한 공백 주의)
- 클라이언트측 비밀키 권한도 설정해야 함
- 접속 시 잘 인증되며, 접속이 될 것임
[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. 서버의 공개키(공통, 리눅스로 실습)
- 클라이언트에서는 아직 연결이 되지 않았는데, 키를 저장할 것인지 물어본다
- 해당 키는 서버가 위변조되었는지 기억하는 용도로만 사용(퍼블릭 키는 인터넷에 돌아다녀도 아무 문제가 없음)
[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 인증과정 총 정리
- 서버 인증
- 클라이언트가 서버를 인증하는 것
- 공개키(대칭키)
- 사용자 인증
- 서버가 정상적인 사용자인지 여부를 확인한다
- 키페어를 사용할 경우: (비대칭키), 공개키(서버) + 비밀키(클라이언트)
- 패스워드를 사용할 경우: (대칭키), 비밀키
- 그렇다면 Data Center에서 우리가 해야 할 일은?
- (키는 client, server 어느 쪽에서 생성해도 상관 없음)
전체적인 과정을 정리하면 다음과 같다
- 템플릿 이미지를 준비한다
- 클라우드용 이미지(OS) - 템플릿만 제공한다(접속할 수 있는 방법은 없음)
- PW(대칭키) 가 아닌, key-pair(비대칭키)를 사용하도록 해야 함
- 이미지 수정하기
- public key 인증 활성화
- 사용할 계정을 미리 만들어 두기
- key-pair 만든다
- 이미지(템플릿)에서 만들어야 하는가? NO!
- bastion host(관리용 서버)에서 만든다
- public-key를 기본 이미지에 추가적으로 부착한다
- virt-customize a test.qcow2 –root password:test123
- 기본 이미지의 루트 패스워드를 test123으로 한다
- virt-customize a test.qcow2 –upload mykey.pem.pub:/root/.ssh/authorized_keys
- 기본 이미지에 키를 저장한다
- private-key는 사용자에게 보여준다 (혹은 다운로드 해 준다)
- 이후 private-key는 삭제한다
- pub 인스턴스, pri 사용자에게 넘어간 상태
- 템플릿 이미지를 인스턴스로 실행한다
- 인스턴스는 퍼블릭 키를 가지고 있고
- 사용자는 비공개 키를 가지고 있다
- 생성된 인스턴스의 정보는 DB에 저장한다
- 인스턴스의 IP, CPU, RAM, HOST(zone)
- 인스턴스의 IP, CPU, RAM, HOST(zone)
- 사용자는 관리페이지에서 IP를 확인하고 접속한다
- ssh -i mykey.pem [IP주소]
- 혹은 ppk 파일을 putty와 연결하여 접속
- 실전에서는, 키 페어를 이미지에 저장하지 않는다
- 인스턴슬르 생성하는 과정에서 키 페어를 생성한다