OCI Permission Denied (PublicKey)

OCI 서버 SSH 접속과 문제 해결

OCI Permission Denied (PublicKey)

들어가며

Windows 10 PC를 사용하는 중입니다. 개발할 때나 취미 생활을 즐길 때나 언제나 사용 중인 데스크탑 PC입니다. 다만 개발할 때 UNIX류 터미널이 필요한 경우가 있죠. 군 복무 중에, 맞선임께서 오라클 클라우드 서울 리전 Ampere 서버에 자리가 났다는 소식을 전해 주셨고, 정말 운 좋게도 해당 서버를 얻는 데 성공해 이렇게 블로그도 올리고 개발도 하고 있습니다. Ubuntu Desktop 설치하고 Guacamole 올려서 원격 접속용 PC로 사용하곤 했습니다.

전역을 하고 제 PC를 쓸 수 있게 되고 나서는 이제 그 서버에 설치해 놓은 Ubuntu Desktop을 쓸 일이 많이 없게 되었습니다. Guacamole가 아무리 좋다고 한들 제 PC에서 SSH로 접속해서 사용하는 게 더 편하니까요 이제. 윈도우에는 WSL2(Ubuntu 22.04 LTS)를 설치해서 사용하고, 서버에서 작업할 때는 SSH 연결해서 쓰는 방식으로 사용하고 있습니다.

그런데 웬 걸, 군 복무 기간부터 쭉 사용하던 태블릿 PC에서는 서버 접속이 되는데, 제 PC에서는 SSH 접속이 되질 않습니다.

혹시 OCI에 서버 올리시고 비슷한 문제를 겪으시는 분들이 계실까 싶어, 오류 해결 일기 하나 올려 봅니다.

OCI 서버에 SSH 접속하기

우선 올바른 접속 방법을 알아봅시다.

OCI Instance를 생성하면서 발급 받은 Private Key와 Public Key 쌍이 있을 겁니다. 이 키 페어는 한 번 받은 이후로는 다시 발급 받을 수 없습니다. 이하 나올 명령어 설명들은 모두 UNIX류 OS에서 사용할 수 있는 명령어입니다.

서버 정보 확인

우선 접속하고자 하는 서버의 정보를 확인합니다.

OCI에 접속해 Dashboard에 들어갑시다.

인스턴스 정보 확인을 위해 Resouce explorer 블록의 Instances를 클릭합니다. 인스턴스 목록이 표시되면 접속하고자 하는 인스턴스를 선택해 줍시다.

인스턴스 정보란 안의 표시한 곳에 IP가 표시되어 있습니다. 그 아래에는 접속할 때 사용할 사용자 이름이 적혀 있습니다.

SSH 접속 명령어

비밀 키 파일 이름을 PrivateKey.key라고 가정합니다. UNIX Shell이나 PowerShell에서 다음 명령어를 통해 서버에 접속합니다. 작업 중인 폴더에 비밀 키가 있다면 아래 파일경로.으로 입력합니다.

$ ssh -p 원격포트번호 -i 파일경로/PrivateKey.key 유저이름@서버IP

이후 나오는 선택지에 yes를 입력하면 접속이 가능합니다. 원격포트번호는 서버에서 따로 설정하지 않았다면 22입니다.

오류가 발생한다면

💡
Error: Permission denied (PublicKey)

위 오류는 SSH 서버에 접속할 때, 정말 여러 원인에 의해 발생합니다. 몇 가지 체크할 부분을 권장 순서대로 짚고 갑시다.

입력 정보 재확인

의외로 IP나 유저 이름 등을 잘못 입력한 것을 놓치는 경우가 많습니다. 우선 OCI Instance의 IP를 올바르게 입력했는지 확인해야 합니다. 위 문단의 SSH 접속 명령어를 다시 봅시다.

$ ssh -p 포트번호 -i 파일경로/PrivateKey.key 유저이름@서버IP

위 명령어와 다른 점은 없는지, 혹시 SSH 접속용 원격 포트를 직접 변경했는지, 혹은 파일 경로가 올바른지 등을 고려해 명령어를 수정해 줍시다.

SSH 서버 작동 여부

원격 서버에 SSH 서비스가 실행 중이 아닌 경우가 있습니다. 다음 명령어를 통해 sshd 서비스가 정상 작동 중인지, 혹시 아예 해당 서비스가 없지는 않은지 확인합니다.

$ sudo service sshd status

만약 다음과 같이 출력되면 정상입니다. 불필요한 정보는 말줄임표로 생략하겠습니다.

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded ( ... )
     Active: active (running) since ...
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1464699 (sshd)
...

위와 같이 출력되지 않고 inactive라고 표시되거나, 찾을 수 없는 서비스라고 출력된다면 openssh 패키지를 다시 설치합니다. 우선 패키지 매니저를 업데이트합니다.

$ sudo apt update

SSH를 위해 다음과 같이 SSH 서버 패키지를 설치합니다.

$ sudo apt install -y openssh-server

다시 서비스 실행 여부를 확인하고 접속해 봅니다.

유효한 Private Key 사용

접속에 사용하는 비밀 키는 반드시 인스턴스를 처음 생성할 때 받은 파일이어야 합니다. 인스턴스 정보 페이지 하단의 Create Console Connection은 SSH 접속과는 다른 방식이므로 해당 기능을 통해 비밀 키를 받으셔도 작동하지 않습니다. 분실했다면 다시 발급하기 까다로우나, 다음과 같은 글이 있어 소개합니다.

오라클 클라우드 우분투 서버 SSH키 분실하여 다른 서버의 키로 복제 성공했습니다. - 자유게시판 - 라이믹스 꿀팁
잘 사용하던 노트북의 SSD가 갑자기 고장나는 바람에 보관하던 서버의 SSH키 모두를 분실했습니다. 다수의 서버는 키파일을 다시 확보할 수 있었는데 여기 라이믹스 꿀팁이 돌아가는 서버의 경우 어디에도 키 정보가 ...

Private Key의 권한, 소유권

Private Key에 너무 크거나 작은 권한이 주어져 있으면 접속에 사용할 수 없습니다.
접속하려는 사용자에게만 읽기/쓰기 권한이 주어져야 합니다.

UNIX류 OS

클라이언트에서 godbell 사용자로 SSH 접속을 하려 한다고 할 때 권한은 400에 사용자와 그룹은 모두 godbell과 그가 속한 그룹이어야 합니다. 파일 정보를 확인해 봅시다.

$ ls -l PrivateKey.key
-rw-rw-r-- 1 root root 1679 Mar 28 15:09 PrivateKey.key

즉 위와 같은 경우 해당 키는 작동하지 않습니다.

다음 명령어로 권한과 소유권을 변경해 줄 수 있습니다.

$ sudo chmod 400 PrivateKey.key
$ sudo chown godbell:godbell PrivateKey.key

Windows

비밀 키 파일에 우클릭 후 속성 창을 엽니다.

보안 탭

위 화면에서 [고급]을 클릭합니다.

[상속 사용 안 함]을 클릭합니다.

위와 같은 창에서 "이 개체에서 상속된 사용 권한을 모두 제거합니다."를 선택합니다.

사용 가능한 사용자가 없어졌습니다. 이제 SSH 접속에 사용할 사용자 하나를 추가합니다.

개체 이름은 C:\사용자\ 혹은 C:\Users\ 폴더에서 자신이 사용 중인 폴더의 이름으로 확인 가능합니다.

모두 확인을 눌러 적용하면 해당 비밀 키를 정상적으로 사용할 수 있습니다.