이전에 계속 공격이 들어온다는 이유로 보안을 강화하는 법을 적은적이 있었습니다. 그 당시에는 SSH의 인증 방식은 그대로 두고, 비밀번호를 여러 번 틀리면 IP 밴을 하는 방식으로 사용했습니다.
이렇게 운영하니 실수로 비밀번호를 3번 틀렸을 때 물리적으로 가서 풀어줘야한다는 부작용이 있었고 변경하게된 결정적인 이유로는 다른 서버가 뚫려버렸습니다. 코인 채굴기가 열심히 돌아가고 있더군요. 이번 경우에는 특정 솔루션을 설치하기 위해서는 고정적인 이름으로 생성해야하는 경우가 몇몇 있고, 해커가 이를 이용해서 비밀번호를 무작위로 대입해서 뚫은 경우였습니다. 그래서 키(KEY)를 이용한 SSH 인증으로 변경하기로 합니다.
사실, 이전에도 키 기반 인증을 보고 있었는데, 각 서버마다 키를 다르게 설정해야하는 줄 알고 "어떻게 삭제하기도 쉬운 키를 여러 개를 동시에 관리하지..?"라는 생각이 들어서, 이전과 같은 방법으로 관리를 했는데, 하나의 키로 여러 서버에 등록하는 법 등을 알게되어 드디어 변경하기로 합니다.
먼저, 아래 명령어를 사용하여 인증에 사용할 Key를 생성해보겠습니다.
ssh-keygen -t rsa
그러면, 위 사진과 같이 키를 생성하기 위해서 몇가지 질문을 합니다.
첫번째 질문! Enter file in which to save the key
는 키를 저장할 경로입니다. 저 같은 경우에는 글 작성을 위해 임시로 생성한 KEY이기 때문에 별도로 경로를 지정하고 만들었습니다.
그 다음 Enter passphrase
는 KEY를 사용할 때 비밀번호를 입력해야하도록 비밀번호를 설정하는 것입니다. 비밀번호 없이 설정할려면 바로 엔터를 누르시면 됩니다.
마지막으로 Enter same passphrase again
은 비밀번호 확인입니다. 없이 설정하였다면, 바로 엔터를 누릅니다.
그럼 생성이 완료되었습니다. 첫번째 질문에서 지정한 파일 이름으로 하나, 파일 이름에 .pub가 붙은 파일 하나 이렇게 2개가 생겼을거예요.
제목에서 짐작하셨을 수도 있지만, 이번에 만든건 KEY 'Pair' 입니다. 하나의 쌍으로 이루어진건데요. 공개 키(Public Key)가 있고, 개인 키(Private Key)가 있습니다. 공개 키는 말 그대로 공개되어도 괜찮지만, 개인 키는 공개되어서는 안 됩니다.
왜냐하면 공개 키로는 개인 키를 알아낼 수 없지만, 개인 키로는 공개 키를 알아낼 수 있기 때문에 양쪽 모두 알게 되는 것 입니다. 그래서, 개인 키를 소중하게 여겨야합니다.
그럼 이렇게 만든 키를 등록해보겠습니다. 키를 등록하는 방식은 이렇습니다. Server에는 공개 키를 등록하고, SSH로 접속할 Client에는 개인 키를 보관합니다.
Linux의 SSH KEY는 User 단위로 구분됩니다. 예를 들어 cocoblue
유저에 이 키를 등록해도, cocored
유저에는 이 키로 접속할 수 없습니다.
본격적인 등록 이전에 위와 같이 생긴 공개 키를 기억합니다.
등록하고자 하는 유저로 접속한 뒤에, ~/.ssh
디렉터리로 이동합니다. 그 다음, authorized_keys
를 vi 등 편집기로 엽니다.
그 다음, 아까 생성한 공개 키를 넣고 저장합니다. 그러면 끝 입니다! sshd를 재시작할 필요도 없습니다.
만일, 새롭게 파일을 생성한 것이라면 파일의 권한을 600으로 조절합니다.
위와 같이 접속이 되는 것을 확인할 수 있습니다.
Key 인증을 드디어 활성화하였지만, 아직은 비밀번호로 인증해도 접속이 되는데요. 이는 별도로 비밀번호 인증을 비활성화해야합니다. 비활성화 방법은 아래와 같습니다.
서버에서 SSH 설정을 변경해야합니다. 아래 명령어를 통해 편집기로 엽니다.
sudo vi /etc/ssh/sshd_config
편집기가 열리면, /PasswordAuthentication
을 입력하여 문구를 찾은 뒤에 주석 처리가 되어 있다면 해제하고, no로 설정합니다.
이후, 아래 명령어로 ssh 서버를 다시 시작합니다.
sudo systemctl restart sshd
위 과정은 테스트 했던 환경(Ubuntu, CentOS)에서 명령어 및 구성 파일 위치가 모두 동일했습니다. 이 과정을 진행하면 더 이상 비밀번호 인증으로는 들어가지지 않습니다.
제가 제일 고민하던 내용이었습니다. 관리하는 여러 서버가 있는데, 이에 접속할려면 각 기기마다 다른 키를 가져야하는가라는 의문이 있었는데, 이 같은 경우에는 위의 '서버에 공개 키를 등록하기' 과정에서 접속하는 서버만 변경하고 반복해서 적용하면 되는 것이었죠.
그렇게 하면, 같은 키로 여러 서버에 접속할 수 있게 됩니다. 저 같은 경우에는 NAS와 AWS에 모두 같은 키를 적용하였습니다.
위 과정을 활용하면 사람마다 각각 다른 키를 할당해주고, 키 유출이나 회사에서는 퇴사 등의 문제가 발생하는 경우 키를 Revoke 하여 접속을 차단하는 방법이 있습니다. 이는 비교적 간단한데 여러 개의 키를 생성하고, 모두 등록하는 것입니다. 하지만, 문제는 "누구의 키인지 어떻게 아냐"인데요.
이는 키를 생성할 때 Comment를 달아두면 해결됩니다. Key-Pair 생성 과정에서 입력하는 명령어에 -C "(남길 코멘트)"
옵션을 이용하여 해당 키를 누가 사용하지는지 적어두시면 됩니다.
이 공간은 위의 내용대로 모두 진행한 후에 생길 수 있는 문제를 다룹니다.
이 경우에는 원인이 여러가지인데요. 저의 경우에는 아래 2가지였습니다. 하지만, 이 경우 모두 물리적인 접근이 필요하니 참고 부탁드립니다.
이 경우에는 authorized_keys의 권한을 600으로 설정합니다.
다른 유저에도 같은 키를 적용한다고 sudo를 이용하여 cp 한 경우에는 소유자 그룹이 root로 지정됩니다. 그럼, ssh를 접속할 때 허가된 키의 목록을 확인해야하는데 이 과정에서 Permission Denied 에러가 발생하여 Key를 인증해줄 수 없게 됩니다. 이 경우에는 소유 그룹을 정확히 적용해주시기 바랍니다.
chown 명령어를 사용하여 소유자, 소유 그룹을 명확히하고, -R 옵션을 적용하여 하위 데이터들에게도 적용되게 합니다.
2번째 이슈는 Windows 환경에서 SSH를 접속할 때 사용하는 PuTTY의 문제입니다. PUTTY는 pem이 아닌 ppk 확장자를 사용하고, 단순하게 확장자를 바꾼다고 지원되는 것이 아닙니다. 이를 변환하기 위해서는 PuTTYgen
이라는 프로그램을 이용하여 변환합니다. 이는 여기서 다운로드 받으실 수 있습니다.
PuTTYgen을 실행하시고 중앙의 Load를 누릅니다. 이후 파일을 선택할 때 All Files로 변경한 뒤에 아까 생성한 파일을 누릅니다.
그 뒤에, Save private key
를 선택해서 파일을 저장하면 됩니다.
비밀 키는 있는데 공개 키가 없는 경우에는 아래 명령어를 사용하여 비밀 키를 이용하여 공개 키를 만들 수 있습니다.
ssh-keygen -f (비밀 키 파일명) -y > (공개 키 파일명).pub
외부에서 키 파일을 다운로드한 경우에는 권한까지 제대로 옮겨지지 않는 문제가 있습니다. 권한을 잡지 않고 접속을 시도하는 경우 키 파일의 권한이 너무 열려있다고 하면서 에러가 발생됩니다.
이 경우에는 키 파일의 권한을 600으로 조절하시면 됩니다.