NCP

[NCP] 네이버 클라우드에서 SSH Key 파일로 로그인 & 키 분실 시 트러블슈팅

안녕하세요. ManVSCloud 입니다.

오늘은 Naver Cloud Platform에서 AWS와 접속 방식이 동일하게 설정해보려 합니다.
(서버 생성 시부터 키가 생성되는 건 아닙니다…)

전에 이런 질문은 받은 적이 있었는데 갑자기 생각나서 작성하게 되었습니다.
“어? AWS에서는 key파일로 접속하던데 네이버 클라우드는 root로 접속이 바로 되고 패스워드로 로그인이 가능하네요. AWS처럼 root 계정 접속 막고 사용자 계정으로 접근할 수 없나요?”

일단 결론부터 말씀드리자면 가능합니다만… 키 관리를 상당히 잘 하셔야합니다.
키를 분실했을 경우 조금 번거로운 작업이 필요할 수 있습니다?!

그래도 그 방법에 대해 포스팅 해보도록 하겠습니다.


서버 생성과 계정 생성

우선 테스트는 VPC 환경에서 진행할 것입니다. 간단하게 서버 한 대만 만들어주면 됩니다.
사양은 크게 상관없습니다.

우선 서버 생성 후 받은 key 파일을 이용하여 root 계정 패스워드 확인 후 해당 서버로 접근합니다.

서버 접근 후 일반 사용자 계정을 생성합니다.
앞으로 root 계정 대신 이 계정으로 접근해야 root 권한을 가질 수 있도록 할 것입니다.
마치 AWS ec2-user 처럼요.

[root@manvscloud-dev-pub-kr1 ~]# useradd -c "NCLOUD Default User" -d /home/ncloud -s /bin/bash ncloud

[root@manvscloud-dev-pub-kr1 ~]# id ncloud
uid=1001(ncloud) gid=1001(ncloud) groups=1001(ncloud)

[root@manvscloud-dev-pub-kr1 ~]# gpasswd -a ncloud wheel
Adding user ncloud to group wheel
[root@manvscloud-dev-pub-kr1 ~]# gpasswd -a ncloud systemd-journal
Adding user ncloud to group systemd-journal

[root@manvscloud-dev-pub-kr1 ~]# grep -E "wheel|systemd-journal" /etc/group
wheel:x:10:ncloud
systemd-journal:x:190:ncloud

사용자 계정명은 ncloud로 했습니다.
생성 후에 필요한 그룹에 해당 계정을 추가해주긴했는데 사실 wheel에 굳이 추가해주지 않아도 /etc/sudoers에 등록해주면 됩니다.
(일반 사용자 계정은 1000부터인데 1001로 만들어집니다.
이는 nbpmon 계정때문인데 이 계정의 홈디렉토리로 가보면 네이버 클라우드에서 사용되는 에이전트와 관련된 계정인 것같습니다.)

[root@manvscloud-dev-pub-kr1 ~]# cat << EOF > /etc/sudoers.d/10-ncloud-users
# User rules for ncloud
ncloud ALL=(ALL) NOPASSWD:ALL
EOF
[root@manvscloud-dev-pub-kr1 ncloud]# chmod 440 /etc/sudoers.d/10-ncloud-users

위에서 말한 /etc/sudoers 입니다.
sudoers.d 아래에 10-ncloud-users 파일을 만들어 ncloud 계정에게 sudo를 사용할 수 있도록 허용해주었습니다.

NOPASSWD 를 주어 패스워드 없이 sudo를 사용할 수 있게 해줍시다.

[root@manvscloud-dev-pub-kr1 ncloud]# passwd -l root
Locking password for user root.
passwd: Success

마지막으로 root 계정을 Lock을 걸어줍시다.

여기까지 했다면 계정 관리부분에서 해주어야할 것은 마무리 됐습니다.


Key 파일 생성

[root@manvscloud-dev-pub-kr1 ~]# cd /home/ncloud/

이제 Key 파일을 생성할 것입니다.
우선 위에서 생성한 ncloud 계정의 홈 디렉토리로 이동 해줍시다.

[root@manvscloud-dev-pub-kr1 ncloud]# openssl genrsa -out master.pem 4096
Generating RSA private key, 4096 bit long modulus
..................................................................................++
.....................................++
e is 65537 (0x10001)
[root@manvscloud-dev-pub-kr1 ncloud]# chmod 600 master.pem
[root@manvscloud-dev-pub-kr1 ncloud]# chown ncloud:ncloud master.pem

openssl 명령어로 master.pem이라는 이름의 RSA Key 파일을 생성해주었습니다.

[root@manvscloud-dev-pub-kr1 ncloud]# mkdir .ssh
[root@manvscloud-dev-pub-kr1 ncloud]# ssh-keygen -y -f master.pem > .ssh/authorized_keys
[root@manvscloud-dev-pub-kr1 ncloud]# chmod 700 .ssh
[root@manvscloud-dev-pub-kr1 ncloud]# chmod 600 .ssh/authorized_keys
[root@manvscloud-dev-pub-kr1 ncloud]# chown -R ncloud:ncloud .ssh

마지막으로 ncloud 계정으로 로그인할 수 있도록 authorized_keys을 생성해줍시다!
이 설정으로 이제 ncloud 계정이 SSH로 접근할 때 필요한 key 파일 설정은 완료되었습니다.


sshd.config 수정

[root@manvscloud-dev-pub-kr1 ncloud]# cat -n /etc/ssh/sshd_config | grep -E "PermitRootLogin|PasswordAuthentication" | grep -v "#"
    38	PermitRootLogin yes
    65	PasswordAuthentication yes

마지막으로 현재 서버는 패스워드로 로그인이 가능한 상태입니다.
Key파일로만 로그인 할 수 있도록 설정할 것이며 패스워드로 로그인이 불가능하도록 막아봅시다.

위와 같이 명령어로 확인해보면 root로 로그인이 가능하며 패스워드로 접근될 수 있도록 설정되어있습니다.

변경 해줍시다.

[root@manvscloud-dev-pub-kr1 ncloud]# sed -i '38s/PermitRootLogin/#&/' /etc/ssh/sshd_config
[root@manvscloud-dev-pub-kr1 ncloud]# sed -i '65s/yes/no/g' /etc/ssh/sshd_config

38번 행 PermitRootLogin yes 부분 앞에 주석처리를 해주었고
65번 행에 yes를 no로 변경해주었습니다.

[root@manvscloud-dev-pub-kr1 ncloud]# sed -n '38p' /etc/ssh/sshd_config
#PermitRootLogin yes
[root@manvscloud-dev-pub-kr1 ncloud]# sed -n '65p' /etc/ssh/sshd_config
PasswordAuthentication no

변경한 뒤 결과를 보면 위와 같이 원하는 결과를 얻게됩니다.
이제 모든 설정이 끝났습니다.

[root@manvscloud-dev-pub-kr1 ncloud]# systemctl restart sshd

sshd를 재시작 해주고 이제 설정이 잘 되었나 확인해봅시다.


결과 확인

  • root 계정 로그인

root 계정으로 로그인을 하니 접속이 불가능합니다.
패스워드도 입력할 수 없고 이런 저런 키로 로그인 시도를 해보아도 선택된 사용자 키가 서버에 등록되어 있지 않다고 합니다.

이제 root로는 로그인을 할 수 없게되었습니다.

  • ncloud 계정 로그인

ncloud 계정으로 로그인 하였습니다.
접속 시 아까 만든 master.pem 키를 이용하여 접근하니 잘 접근이 되네요.

그리고 sudo su – 명령어로 root 권한도 얻을 수 있습니다.
AWS의 ec2-user와 접근 방식이 동일하게 되었네요.


키 분실 시 트러블슈팅

Naver Cloud Platform에서 KEY 파일로 SSH 로그인에 대해 알아보았습니다.

하지만 가끔 .ssh와 .ssh/authorized_keys 파일을 수정하시거나 잘못된 권한을 주어 문제가 생겼을 경우 또는 키 파일을 분실했을 경우, sshd 파일을 잘못 설정한 경우 등 다양한 원인으로
로그인에 문제가 생길 수 있습니다.

키 파일을 이용하시다가 만약 키를 분실하셨을 경우 어떻게 이를 해결할 수 는지 추가적으로 알아보도록 하겠습니다.

1. 우선 루트 볼륨을 떼어서 다른 서버에 붙일 수 없습니다.
→ 사실 이 방법이 가장 원인 파악하기 좋은데 루트 볼륨을 떼서 다른 서버에 붙일 수 없는 것이 조금 아쉽습니다.
(온프레미스의 경우 싱글 모드로 부팅하여 확인하거나 다른 서버에 장착하여 확인이 가능합니다.)

2. 루트 볼륨을 스냅샷으로 생성하여 restore 서버에 장착한다?
→ 우선 스냅샷으로 서버 생성은 되지 않습니다. 스토리지만 생성이 가능합니다.
이 말은 즉, 해당 스토리지 문제를 해결한다고 해도 위에서 말한 루트 볼륨 교체가 불가능하여 사실상 의미가 없습니다.

또한 원인 파악을 위해 다른 서버에 붙이더라도 루트 볼륨은 정상적으로 마운트 되지 않고
아래와 같은 에러가 발생하며 정상 마운트가 되지 않습니다.

[root@manvscloud-restore-pub-kr1 ~]# mount /dev/xvdb2 /restore
mount: wrong fs type, bad option, bad superblock on /dev/xvdb1,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

3. 마지막으로 이미지 생성 후 복원하는 방법입니다.
→ 이미지로 생성 후 해당 이미지로 서버를 재생성하여 만들어도 sshd.config 파일에서
패스워드가 아닌 키 파일로만 접근이 가능하게 설정을 해두었기때문에 생성한 이미지로 서버를 재생성 하여도 콘솔에서 확인되는 root의 패스워드만 변경될 뿐 패스워드 입력 불가능 및 root 계정 Lock으로 로그인을 할 수 없습니다.

단, 원인을 알고 있다면 이는 충분히 복원이 가능합니다. 어떻게 가능하냐?!
바로 Init Script를 이용하는 것입니다.

원인이 .ssh와 .ssh/authorized_keys 수정인지, 권한 문제인지, sshd.config 파일 수정으로 인한 문제인지 어떤 것을 수정하였는지 정확한 원인을 모른다면 이 방법도 크게 해결 방안이라 보기 어렵지만 단순히 키 분실이라는 원인으로 해결을 원하신다면 아래와 같은 방법이 있습니다.

Server – Init Script
Init Script 생성
#!/bin/bash
passwd -u root
sed -i '38s/#//' /etc/ssh/sshd_config
sed -i '65s/no/yes/g' /etc/ssh/sshd_config
systemctl restart sshd

Init Script를 recovery-due-to-key-loss라는 이름으로 생성해주었습니다.

스크립트 내용은 간단합니다.
본문 내용에서 root 계정 Lock을 걸었던 것을 풀어주고 sshd_config에서 주석 처리 및 수정했던 값들을 다시 원래대로 수정하고 sshd를 재시작하는 것입니다.

만약 몇번째 행인지 알 수 없다면 스크립트를 아래와 같이 사용할 수도 있겠습니다.

#!/bin/bash
passwd -u root
sed -e '/PasswordAuthentication/s/^/#/g' -i /etc/ssh/sshd_config
echo PasswordAuthentication yes >> /etc/ssh/sshd_config
echo PermitRootLogin yes >> /etc/ssh/sshd_config
systemctl restart sshd

PasswordAuthentication라는 특정 문자열이 들어가는 라인을 전부 주석 처리하고
/etc/ssh/sshd_config 파일 아래에 PasswordAuthentication yes와 PermitRootLogin yes를
추가해준 뒤 sshd를 재시작하는 스크립트입니다.

키 분실 서버를 선택하여 ‘내 서버 이미지 생성’으로 이미지를 생성해줍니다.
서버 중지없이 이미지를 생성할 수 있으니 참고하시면 좋을듯합니다.

생성된 이미지로 서버를 아래와 같이 생성해줍니다.
서버 생성 화면에서 Script 선택 시 위에서 만들어준 Init-Script를 넣어주는 것이 포인트입니다.

이후 생성된 서버를 실행시켜보면 아래와 같이 root 접속 시 password로 접속할 수 있게 되며
접근도 가능하게 됩니다.

중요한 건… 이 방법 역시 원인을 알고 있을 경우 Init Script로 해결할 수 있는 것이지
원인을 모른다면 해결이 어려우니 이미지 백업을 주기적으로 하거나 중요한 데이터 스토리지는 루트 볼륨에 저장하기보다 스토리지를 분리하여 사용하는 것이 좋습니다.


마지막으로…

Naver Cloud, AWS, Azure, GCP, IBM, Oracle, 알리바바, 텐센트 등 상당히 많은 클라우드 플랫폼이 존재하게 되었습니다. 한국의 네이버 클라우드 역시 새로운 기능들이 재빠르게 추가되며 무서운 성장속도를 보여주는 것같습니다. 아직 원하는 기능들과 바라는 점들이 있지만 그런 부분들도 어서 추가되었으면 하는 바람입니다.

데이터를 국내에 보관할 수 있다는 점도 좋지만 무엇보다 모든 설명서나 소개, 웨비나, 교육들이 한국어로 진행되다보니 습득하는데에 큰 어려움이 없다는 점과 이 가장 매력인듯합니다.

이상 네이버 클라우드에서 SSH KEY 파일로 로그인 하는 방법과 키 분실 시 트러블슈팅 방법에 대해 알아보았습니다. 다음 포스팅은 더욱 알찬 내용으로 찾아뵙겠습니다.

긴 글 읽어주셔서 감사합니다.

Previous Post Next Post

You Might Also Like

2 Comments

  • Reply moddi 5월 6, 2021 at 9:42 오전

    NCP ssh 보안에 궁금한 점이 시원하게 해결되었어요!
    이제 곧 여름인데 포스팅을 보고 있으니 시원하게 보낼 수 있을 것 같습니다 ㅎ__ㅎ

    다음 포스팅은 얼마나 알찰지 벌써부터 기대되는군요

    • Reply manvscloud 5월 7, 2021 at 9:15 오후

      다음 포스팅은 아마 네이버 클라우드 프로 시험이 끝난 후 포스팅 될 예정입니다. 이제 곧.. 프로 마지막 시험이라…

    Leave a Reply