macOS 는 기본적으로 openssh 를 내장하고 있다. openssh 는 ssh 클라이언트와 ssh 데몬을 제공한다. 데몬들을 systemd 가 관리하는 리눅스와는 다르게 macOS 에는 launchctl 이라는 유틸리티가 있다.
sudo launchctl stop com.openssh.sshd
sudo launchctl start com.openssh.sshd
명령어를 통해 ssh 데몬을 재시작할 수 있다. ssh 데몬 사용 설정 (즉 부팅시에 자동으로 로드할지) 도 cli 로 할 수 있을 것 같은데, 이건 그냥 System Preferences -> Sharing, enable Remote Login 에서 설정하는 편이 마음이 편하다.
우리가 해야 할 건 etc/sshd_config 에 PasswordAuthentication No 라는 라인을 추가하는 거다. 참고로 같은 설정이 있으면 가장 나중 라인이 그 설정을 override 한다. 설정을 따로 분리할 수 도 있는데, /etc/sshd_config.d 디렉토리 내부에 이름이 .conf 인 파일도 설정에 적용된다. 설정 순서는 이름순이기 대문에, 10-.conf 처럼 숫자를 통해 설정이 로드될 순서를 조절하는 것도 좋다. 나같은 경우엔
sshd_config.d
|-- 00-auth.conf
|-- 10-users.conf
|-- 100-macos.conf
`-- 30-port.conf
처럼 해서 설정을 분리시켜 놨다. 100-macos.conf 는 내가 만든 파일이 아니구 macOS 전용 openssh 설정 되어있는 부분 같다.
#00-auth.conf
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
ChallengeResponseAuthentication no
MaxAuthTries 3
#10-users.conf
AllowUsers git
AllowUsers <administrator> #git 이외의 서버 admin 계정
#30-port.conf
#Port 2222
참고로 macOS 의 경우, 다른 포트를 사용하려면 여기서 포트를 설정하고, /etc/services 에서도 또 포트를 수정해 줘야 한다.
# ssh 22/udp
# ssh 22/tcp
ssh 2222/udp
ssh 2222/tcp
왜그런지는 몰?루 아마 방화벽이랑 launchctl 관련 설정인것 같아 보인다.
PasswordAuthentication 을 비활성화 했기 때문에, 계정에는 ~/.ssh/authorized_keys 에 public key 가 있는 클라이언트만 접속 가능하다.
key pair 는 다음 명령어로 생성 가능하다
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t 는 암호화 방식으로, rsa 말고도 ecdsa, ecdsa-sk, ed25519, ed25519-sk 알고리즘을 사용 가능하다. 각 알고리즘에 대해서는 추후 포스팅에서 다루도록 할 예정이다.
-b 는 생성한 key 에 있는 비트 수를 나타낸다.
사실 많은 사람들이 처음 접하게 될 github 매뉴얼에는 rsa 키를 사용하라고 나와있지만, ed25519 방식은 256 비트의 키 사이즈를 가지고 복호화 해서, 3072나 4096 비트의 키 사이즈를 사용해야 하는 rsa 보다 빠른 방식이다. 플래그를 지정하지 않고 ssh-keygen 을 하면 기본적으로 이 알고리즘이 선택된다.
아무튼 이렇게 key pair 을 지정했으면 public key 를 이메일이나 pastebin 으로 보내서 서버의 알맞는 계정의 ~/.ssh/authorized_keys 에 추가하면 된다. public key 는 어디든 올려도 상관없지만, private key 를 올라는 순간 그 키로 접속 가능한 서버에 누구나 접속 가능하다는 사실을 명심하자.
참고로 .ssh 의 권한은 drwx——,
chmod 700 ~/.ssh
.ssh/authorized_keys 의 권한은 -rw——-
chmod 600 ~/.ssh/authorized_keys
로 설정해야 한다. 다른 유저들이 읽을 수 있는건 상관 없지만 수정 가능하게 되어 있으면 아마 에러가 나올 거다.
여러 서버나 클라이언트가 존재할때는
- 클라이언트에서 하나의 private key 로 여러 서버에 접속하도록
설정하지 않을것.
- 서버에서는 각 public key 에 주석을 달아 어떤 라인이 어느
클라이언트인지 알 수 있도록 할 것.
을 지키도록 하자.
git 서버의 경우 추가적으로
chsh -s $(which git-shell)
을 통해 서버의 로그인 shell 을 git-shell 로 바꾸어 git 서버에 push 권한을 가진 사람이 서버에 그냥 로그인해 다른 일을 할 수 없도록 만들자.