SSH는 Secure Shell의 약자, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜 입니다. 기존 원격 접속은 텔넷(Telnet)이라는 방식을 사용했는데, 암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 존재하여, 암호화하는 SSH 기술이 등장했습니다. 현시점에서 SSH는원격접속을위한필수적인프로토콜로사용되고있습니다.
Jenkins 나 ansible 그리고클라우드서비스에서제공하는서버등은모두원격접속으로접근하여사용하기때문에, 서버생성시필수적으로 SSH 보안과정을거쳐야합니다.
비대칭키 방식은 사용자와 서버가 서로의 정체를 증명하는 과정입니다. 사용자는 Key Pair 를 생성합니다. 키 페어는 공개 키와 개인 키 두가지로 이루어져 있으며 한 쌍을 이룹니다. 공개 키의 경우는 .pub 개인 키의 경우는 .pem 파일 형식을 가지고 있습니다.
공개 키는 유출되어도 문제가 되지 않는 말 그대로 공개 키 입니다. 이 공개 키(.pub) 를 서버에 전송하여 저장합니다. 이후에 개인 키(.pem)를 가진 사용자가 공개 키를 저장한 서버에 연결을 시도하면 키 페어는 인증되어 서버는 사용자를 식별할 수 있게 됩니다. 즉, 개인키(.pem) 는사용자를식별할수단이기때문에유출되지않도록주의해야합니다.
대칭키 방식
비대칭키 방식에서 사용자를 식별하였으니 데이터를 전송할 수 있습니다.이 과정에서 데이터가 유출되지 않도록 암호화를 통해 주고 받는데 대칭키 방식이 사용됩니다. 하나의 키를 사용자와 서버가 공유하게 되고, 이 키를 통해 전송자는 데이터를 암호화, 수신자는 데이터를 복호화 하여 정보를 주고 받게 됩니다. 대칭키는재접속시새로운대칭키가생성됩니다.
실습
ssh-keygen 명령어를통해키페어를생성합니다.
최초 명령어를 입력하면 key를 저장할 경로를 설정합니다. 기본 경로는 ~/.ssh 에 저장되게 됩니다. 기본 경로를 사용하기 위해 엔터를 입력합니다.
다음으로 passphrase 를 입력하게 됩니다. 이는 개인키에 한번더 비밀번호를 설정할지 묻는 것입니다. 비밀번호 없이 생성하도록 엔터를 입력하겠습니다.
해당처럼 알 수 없는 문양과 함께 ssh-key 생성이 완료되었습니다.
~/.ssh 디렉토리로 이동해보면 아래처럼 파일이 생성되었습니다.
$ ls
id_rsa id_rsa.pub
id_rsa 는 개인 키 파일입니다. 해당 파일은 유출되지 않도록 유의 해야 합니다.
id_rsa.pub 는 공개 키 파일입니다. 이 공개 키를 접속하고자 하는 서버에 저장하면 해당 서버에 접속할 수 있게 됩니다.
known_hosts 나 authorized_keys 등의 파일은 다른 서버에 접속했거나 혹은 내 서버에 다른 사용자가 접속했을 때 생길 수 있습니다.
이제 해당 공개 키를 가지고 다른 서버에 접속하려면 해당 서버에 접속해서 .ssh 디렉토리로 이동합니다. 만약 다른 서버의 jenkins 계정을 통해 접속하고 싶다면
1. jenkins 계정의 홈디렉토리에 .ssh 디렉토리로 이동 2. auauthorized_keys 파일을 열어줍니다. (없다면 새로 생성해줍니다.) 3. 사용자의 id_rsa.pub의 파일 내용을 복사해서 해당 파일에 입력 후 저장해주면 됩니다.
이렇게하면 jenkins 계정으로 접속 시 비밀번호를 대체하여 해당 키 파일 인증을 통해 접속할 수 있게 됩니다.
접속이 안될 때
접속이 안된다면 방화벽의 문제가 있을 수 있습니다. 해당 서버 간에 통신이 원할한지 확인합니다.
만약 192.168.0.1 IP를 가진 서버에 접속하고 싶다면 접속하려는 서버에서 아래의 명령어를 입력해줍니다. SSH 는 22번 포트를 사용하기 때문에 192.168.0.1:22 포트에 접속하려한다고 가정하겠습니다.
echo > /dev/tcp/192.168.0.1/22
만약 위와 같이 명령어를 입력했는데 바로 종료되고 아무 출력이 나타나지 않는다면 통신이 가능한 상태, 즉 방화벽이 막혀있지 않다는 뜻입니다. 하지만 오랜 시간 응답하지 않다가 time out 이 발생한다면 방화벽을 점검해보면 되겠습니다.
만약 방화벽 문제도 아니라면, 접속하려는 서버의 /etc/security/access.conf 에 권한을 부여해야 합니다.
+ : jenkins : ALL
위 처럼 jenkins 부분에 접속을 허용할 계정의 이름, 모든 ip 에서 접근을 허용하기 위해선 ALL, 특정 ip 만 허용하려면 해당 ip나 대역을 입력해주면 됩니다.