1. Python 2.7.x 소스를 다운 받아 압축을 해제한다.
  2. cd Python-2.7.x
  3. ./configure
  4. make && make altinstall
  5. python -V # 아직 2.6.x 뜰 것이다.
  6. mv /usr/bin/python /usr/bin/python_backup
  7. cp /usr/local/bin/python2.7 /usr/bin/python
  8. python -V # 이제 2.7 뜸

근데 문제는 yum 이 2.6에 맞춰져있어서 yum 도 건드려줘야 한다.. 이거 때문에 한참 헤맴..

  1. cp /usr/bin/yum /usr/bin/yum_backup
  2. nano which yum
  3. #!/usr/bin/python 에서 python 을 python_backup 으로 수정 (위 6번 참고)
  4. yum update 확인

일반적으로 서버의 SSH 접속하기 위해 사용자의 아이디와 비밀번호가 필요하다. 이 말은 즉슨 대충 ID만 알아도 Brute Force Attack 할 수 있다는 얘기가 된다. 서버 관리자 입장에서 생각해보면 여간 짜증나는 일이 아니다. 로그인이 안 된다 할지라도 해킹이 시도되는 동안 소모되는 서버 자원은 어쩔 것인가 ㄷㄷㄷㄷ

이를 방지하기 위해 Fail2Ban 과 같은 Python 기반의 스크립트를 이용하여 지정된 횟수 이상으로 로그인을 실패하면 해킹으로 판단하여 일정시간 접근을 차단시키는 방법도 있다. 하지만 이 방법도 지정된 횟수 이내로.. 예를 들면 로또보다 더한 확률로 1~2번 시도만에 로그인이 성공하면 낭패다. (그러니 유저들을 추가할 땐 비밀번호 정책을 빡세게 합시다 ㄷㄷㄷ)

하지만 OTP를 이용하게 되면 약간은 안심이 될 것 같다. 1분마다 6자리의 숫자가 갱신이 되고 그 이전의 숫자조합은 무용지물이 되어버리니 이 얼마나 짱짱한가. 몇가지 OTP 서비스들이 있긴 하지만 Google OTP(정확히 말하면 Google Authenticator) 를 이용하기로 했다. 별 거 없다. 왜냐면 구글신이니까..

말머리에서 언급한 바와 같이 SSH 접속하기 위해선 사용자의 아이디와 비밀번호가 필요하지만 Google Authenticator 를 이용하면 그 중간에 OTP 번호를 입력하는 절차가 추가된다.

예를 들면 다음과 같다.

일반적인 SSH 로그인

일반적인 SSH 로그인

 

OTP 이용한 SSH 로그인

OTP 이용한 SSH 로그인

 

세팅하는 방법을 순서대로 나열하겠다. 기존의 타 블로그들에서 작성된 대부분의 Google Authenticator 세팅 방법들은 크게 문제가 없지만 중요한 부분이 빠져있다. 이 글에선 빠지지 않고 모두 작성해놨으니 그대로 차근차근 실행만 한다면 될 것이다.

  • CentOS 6.8 & 7 기준으로 작성
  • root (최고관리자) 권한 기준으로 작성
  • 작업시작 전 모든 패키지들을 업데이트 (하지 않아도 크게 상관 없음)
  1. .ssh 디렉토리 권한 변경
    * 필수 작업 – 0700으로 맞추지 않으면 로그인이 제대로 작동하지 않는다.
  2. Google OTP 패키지 설치에 필요한 필수 패키지 설치
  3. Git 으로 Google OTP 다운로드
  4. 소스 컴파일 작업
  5. Google Authenticator 설정
  6. y 누르고 엔터 (일반적으로 2번)
  7. 스마트 폰에 Google Authenticator 앱 설치 후, 모니터에 나타나는 QR코드 촬영 또는 Secret Key 작성으로 OTP 추가
  8. PAM 설정

    8.1. %PAM-1.0 바로 밑에 다음 내용 추가 (한 줄임)

    8.2 저장
  9. SSH 설정

    9.1. 다음 설정사항들을 모두 yes로 변경

    9.2 저장
  10. SSH 재시작
  11. (옵션) 모든 유저에게 OTP 부여가 완료되었고 더이상 유저 추가 계획이 없을 경우 8.1. 에서 추가된 내용 중 nullok 를 삭제한다.
    nullok 삭제시 해당 서버 SSH에 접근하는 모두가 OTP를 거쳐야 함.

 

위 과정을 모두 마치면 Google Authenticator 를 거쳐 로그인을 할 수 있다. 이렇게 되면 어제 작성했던 Root 비밀번호 자동 변경 쉘 스크립트에서 비밀번호를 좀 더 약하게 생성시켜도 괜찮을 듯 하다.

약 2주간 적용하고 싶은 마음에 수많은 삽질을 했고 결국 성공했다. 별 거 아닌데 뿌듯하다.

 

좀 귀찮고 짜증나지만 보안관련해서 신경써야 할 것들이 여간 많은게 아니다.

그 중에서 현실적으로 내가 할 수 있는게 뭐 있을까 고민을 거듭하다 Root 비밀번호 관리만 빡세게 잘 된다면 솔직히 크게 문제될 것은 없을거라고 판단했다. 또한 SSH 포트 번호는 일반적으로 사용되는 22번에서 다른 임의의 번호로 이미 변경하였다.

CentOS 기반의 서버 4개를 돌리고 있다보니 매번 4개 서버에 접속해서 비번 바꾸는 것도 귀찮아 쉘 스크립트를 작성해봤다.

다음은 해당 쉘 스크립트 소스를 예제 버전으로 변경한 내용이다.

 

 

/dev/urandom 에서 ‘영문자/숫자/특정특수문자’를 12자리 추출한 뒤, 해당 12자리를 지정된 서버의 root 권한으로 접속하여 비밀번호를 변경한다. 이를 위해선 미리 SSH 자동로그인이 될 수 있도록 해야한다.

또한 해당 비밀번호를 임시파일에 간단히 기록하고 지정된 이메일 주소로 내용을 발송한 후 임시파일을 삭제하도록 했다.

 

위 쉘 스크립트를 매일 0시 1분에 실행하도록 crontab 을 설정했다. 매일 0시 1분에 지정된 이메일로 새롭게 변경된 서버들의 각 패스워드가 전달된다.

이로 인해 약간은 보안이 강화(?)되었다고 생각하고 있다.

 

– 뒷 얘기 –
원래 계획은 쉘에 접속중인 모든 유저들의 프로세스를 강제 kill 시킨 후 위 내용을 진행하려 했으나(테스트까지 모두 완료) 혹시 모를 중요한 사태에 대비해 해당 내용은 제외시켰다.