티스토리 뷰

Daylogs/Etc

Capistrano 인증

ohgyun 2014. 8. 2. 01:18
발생일: 2014.01.14

키워드: Capistrano, 카피스트라노, 인증

문제:

개인 프로젝트에 배포 자동화를 도입하려고 Capistrano를 알아보고 있다.
각 서버 간 SSH로 인증/인가하는 가이드를 보면서 정리해둔 내용이다.


해결책:

Authentication and authorisation


인증 자동화가 필요한 곳

1. 개발자 로컬 피씨에서 서버로
     - key agent를 써서 SSH Keys로 해결한다.
     - 공개키를 서버에 두고, 로컬의 SSH 클라이언트에서 비공개 키로 확인해 로그인한다.
     - 공개키를 서버의 deploy 유저의 `authorized_keys` 파일에 추가한다.
     - 로컬에서는 `ssh-keygen -t rsa -C ‘me@my_email.com` 명령으로 생성한다.
          이 때 passphrase 가 필요한데, 적당한 값을 넣어둔다.
          이건 누군가 로컬 PC를 탈취했을 때, 키에 액세스할 때 필요한 값이다.
     - 매번 passphrase를 넣는 걸 피하기 위해서 대부분의 운영체제는 `key agent`라는 걸 제공한다.
           `key agent`는 SSH 키를 보관하고 있다가, 키가 필요할 때 로드하면서 passphrase를 묻고,
          유효 시간 동안 `key agent`가 passpharse를 저장하고 있는 방식이다.
          (OSX는 무한정, 리눅스는 15분에서 더 큰 값까지 다양하다)
     - `ssh-add -l`로 현재 로드되어 있는 SSH agent 값을 볼 수 있다.
          추가하려면 단순히 `ssh-add`를 입력하면 된다.
     - 로컬 피씨에서 생성한 퍼블릭 키는 `ssh-add -L` 명령으로 가져올 수 있다.
          이렇게 가져온 키는 각 서버의 `deploy/.ssh/authoized_keys` 파일에 추가해준다.
          `authorized_keys` 파일의 권한은 0600으로,
          `~/.ssh` 디렉토리는 0700으로 설정되어야 한다.
     - 모든 작업이 완료됐으면 passphrase 를 묻지 않고 아래 구문이 정상적으로 출력되어야 한다.
          `ssh deploy@one-of-my-servers.com ‘hostname; uptime'
          

2. 서버에서 소스 리파지터리로
     - SSH agent forwarding으로 해결한다.
     - 1번에서 만든 ssh key를 서버에서 사용하도록 할 수 있다.
     - 먼저, 리파지터리의 URL을 가져오고, (ex) git@github.com:ohgyun/testapp.git
     - 아래와 같이 포트 포워딩으로 처리할 수 있다.
          `ssh -A deploy@one-one-of-my-servers.com ‘git ls-remote git@github.com:ohgyun/testapp.git’`
     - 로컬과 서버에서 모두 포워딩을 허용하고 있어야 한다.

     - 또는, 깃헙 리파지터리에서 Deploy Keys를 추가할 수 있다.
          공개키를 깃헙에 올려두고, 비밀키를 각 서버에서 갖고 접근하는 방식이다.
          https://help.github.com/articles/managing-deploy-keys 를 참고한다. 


Authorization

- deploy 유저가 특정 디렉토리에 권한을 가질 수 있도로 한다.
- `:deploy_to` 변수로 설정하는 디렉토리 권한을 `deploy`로 준다.

    me@localhost $ ssh root@remote
    # Capistrano will use /var/www/....... where ... is the value set in
    # :application, you can override this by setting the ':deploy_to' variable
    root@remote $ deploy_to=/var/www/rails3-bootstrap-devise-cancan-demo
    root@remote $ mkdir -p ${deploy_to}
    root@remote $ chown deploy:deploy ${deploy_to}
    root@remote $ umask 0002
    root@remote $ chmod g+s ${deploy_to}
    root@remote $ mkdir ${deploy_to}/{releases,shared} 

반응형
댓글
공지사항