bitbuket 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다. 보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 bitbucket 을 예로 들고 있다.

과정은 bitbucket 을 예로 들었지만 github 도 유사한 과정을 거친다. github에서 Key 등록에 대해서는 링크를 참조한다. github 에 SSH key 등록하기


SSH 구성과 2단계 인증

Git Credential Manager (GCM) 를 git client 에서 bitbucket 에 접속해 사용하는데 이용할 수 있다. SSH 구성을 하지 않고 bitbucket 을 사용하려면 GCM 을 사용하면 된다. Git Credential Manager

단, GCM works over HTTPS, not SSH. 그래서 git clone https://{username}@bitbucket.org/{workspace}/{repository}.git 이렇게 요청해야 한다.

설명에 따라서 먼저 ssh host key 를 생성하고 bitbucket 에서 사용하는 개인용 ssh key 를 만든다. 이후 bitbucket 에 등록하면 된다.

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@bitbucket.org/<accountname>/<reponame>.git

  1. SSH

git@bitbucket.org:<repo_owner>/<reponame>.git

or

ssh://git@bitbucket.org/<repo_owner>/<reponame>.git

bitbucket은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 2048

# DSA / DSS (dsa) / 1024
$ ssh-keygen -t dsa -b 1024

SSH Host Key 생성

아래는 bitbucket 서버의 공개키 이다.

1
2
3
256 SHA256:FC73VB6C4OQLSCrjEayhMp9UMxS97caD/Yyi2bhW/J0 bitbucket.org (ECDSA)
256 SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM bitbucket.org (ED25519)
2048 SHA256:46OSHA1Rmj8E8ERTC6xkNcmGOw9oFxYr0WF6zWW8l1E bitbucket.org (RSA)

해당 공개키가 적적할지 확인은 다음 같이 curl 로 테스트해볼 수 있다.

1
curl https://bitbucket.org/site/ssh

개별키 생성

ssh 를 사용해서 bitbucket 클라우드에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 bitbucket에 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

Bitbucket Cloud with your public key

bitbucket 을 위해 생성한 키 쌍에서 공개키 KEY_FILE.pub 를 bitbucket 의 계정에 등록해 주어야 한다.

  1. Settings -> Personal Settings
  1. Secutiry -> SSH Keys -> Add key

생성한 키 쌍에서 bitbucket_work.pub 같이 공개키를 등록하는데, 공개키 파일 내용을 복사해 붙여넣기를 하면 된다.

cat 명령 등으로 내용을 복사한다.

1
2
3
4
5
> cat .\.ssh\bitbucket_work.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDo+7VGfxlhxFsy0Edu+PPmqngJVzwLQuLPanOi5x8t2yu7RmFNlEfU32AgA7vkoLno98XFZaUZ3ZjMwVu7LWeLMNczx5nH//
...
...
+v7ttamzvFe8idOtCjJszG5l8rn4poIN2E24AWGvCGbzs55WRXY/amYEqP5/maH0NT+pYM2ZMV7Nt8Jb86iQ== james@thinkbee.kr

사이트의 Add key 창에 붙여 넣는다.

이제 새 SSH 키가 등록되었다.

클라이언트에서 bitbucket 에 SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속 여부를 묻는다. 아래 같이 bitbucket.org 접속시 접속 여부를 묻는 다이얼로그가 나온다.

1
2
3
4
5
6
7
8
9
$ ssh -T git@bitbucket.org
The authenticity of host 'bitbucket.org (104.192.141.1)' can't be established.
ED25519 key fingerprint is SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'bitbucket.org' (ED25519) to the list of known hosts.
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 bitbucket 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/
  2. github 에 SSH key 등록하기

github 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다.

보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 github 에 ssh key 등록 과정을 요약하고 있다.


SSH 구성과 SSH 인증

먼저 ssh host key 를 생성하고 github 과 사용할 개인 key 를 만든다. 개인키를 ssh-agent 방식으로 등록하고 공개키를 github 에 등록하면 된다.

ssh-agent 키 관리

로컬 머신에서 사용하는 SSH Key 쌍에 대한 접근을 ssh-agent 를 통해서 진행한다. managing deploy keys 에 설명되어 있다.

  • 에이전트 전달은 로컬 개발 컴퓨터에서 사용하는 것과 동일한 SSH 키를 사용합니다.
  • 단 사용자 클라이언트에 SSH에 있어야 합니다

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@github.com/<accountname>/<reponame>.git

  1. SSH

git@github.com:<repo_owner>/<reponame>.git

or

ssh://git@github.com/<repo_owner>/<reponame>.git

github은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 4096

개별키 생성

ssh 를 사용해서 github 에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 github에 SSH Key를 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에서 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t ed25519  -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: github 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 github 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

github 에 public key 등록하기

github 계정의 SSH and GPG keys에서 등록해 주어야 한다. 키 쌍 중 공개키 KEY_FILE.pub 내용을 등록해 준다.

  1. Settings -> Personal Settings
' >

cat 명령 등으로 내용을 복사한다. 사이트의 Add key 창에 붙여 넣는다.

클라이언트에서 github SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속시 접속 여부를 묻는 다이얼로그가 나온다.

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
$ $ ssh -T git@github.com

Hi USER! You've successfully authenticated, but GitHub does not provide shell access.

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 github 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. Connect with SSH, github
  2. SSH 연결 테스트, github
  3. bitbucket 에 SSH key 등록하기

Linux - X Forwarding

SBC 보드 (raspberry pi, odroid c2 등)를 Terminal 기반으로 사용하려고 할 때 GUI에서 Programming을 확인해야 할 경우 X11, VNC 등을 이용할 수 있다. 여기서는 X Forwarding 기법을 정리하고 있다.

[^1]: Single Board Computer

X11 Forwarding

X11은 유닉스/리눅스의 전통적 데스크탑 프로토콜로 GUI 데스크탑 환경을 X11 Protocol을 사용해서 로컬 혹은 원격지 컴퓨터에서 이용할 수 있게 설계되어 있다.

X Windows: X ming

윈도우즈에서 X ming 환경을 구축하면 X window system을 사용할 수 있다.

자세히 보기

Linux - ssh-sshfs

ssh 사용 팁과 sshfs 이용 방법에 대해서 정리한다.

ssh

터미널에서 ssh를 사용하는데 이용하는 구성과 설정을 정리했다.

비밀키 이용

ssh를 사용하는 클라이언트에서 ssh-keygen 으로 비밀키공개키를 생성하고, 접속하는 서버 계정 밑에 클라이언트 공개키를 저장하면 ssh 접속시 비밀번호 응답 없이 처리되어 로그인 할 수 있다.

1. ssh 클라이언트

클라이언트에서 개인 비밀키를 생성한다. ssh-keygen 명령은 기본적으로 비밀키와 공개키 파일을 사용자 홈디렉토리 ~/.ssh 폴더에, 기본 파일이름 id_rsa.pub, id_rsa.prb 파일로 저장한다.

1
(CLIENT)$ ssh-keygen -t rsa -b 4096 -C "USER@localhost"

2. ssh 서버

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@server"

서버에 공개키 배포

클라이언트에 생성한 공개키 id_rsa.pub 파일을 업로드해서 ./ssh/authorized_keys 파일에 추가해야 한다. 보통 scp 명령으로 복사해서 authorized_keys 파일에 더해주면 된다.

일반적으로 scp 명령으로 복사하고, 서버에 ssh 접속해서 업로드한 공개키 파일을 authorized_keys 파일에 더해준다.

1. 클라이언트에서 복사하기:

1
scp ~/.ssh/id_rsa.pub USER_ID@HOST_NAME:~/client.pub

ssh로 서버에 로그인한다.

2.서버 authorized_keys 붙여넣기:

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

위 2 과정을 아래 명령 한 줄로 복사->붙여넣기를 동시에 할 수 있다.

클라이언트:

1
cat ~/.ssh/id_rsa.pub | ssh <USERNAME>@<IP-ADDRESS> 'cat >> .ssh/authorized_keys'

이제 해당 서버로 로그인해 본다.

ssh config 사용하기

사용자를 위한 ssh 구성을 하려면 ~.ssh/config 설정 파일을 이용한다.

keep alive session

ssh 접속시 옵션을 주어 세션 유지 시간을 지정할 수 있다.

ServerAliveInterval 사용

접속시 ServerAliveInterval=TICK를 사용하면 TICK초 마다 한번씩 ServerAliveInterval를 보낸다.

옵션을 직접 사용하거나 ~/.ssh/config 설정 파일에 지정해 둘 수 있다.

ssh 접속시 -o 옵션으로 지정한다.

1
ssh -o ServerAliveInterval=10 192.168.0.1

~/.ssh/config 이용

사용자의 ssh 설정 파일은 ~/.ssh/config 이다.

1
2
3
4
5
# For all hosts
ServerAliveInterval 20
# For a selection of hosts
Host 192.168.0.1 192.168.1.1
ServerAliveInterval 20

시스템 전체에 적용한다면 /etc/ssh_config 에 (혹은 데비안 계열은 /etc/ssh/ssh_config) 지정해도 된다.


## sshfs

원격 호스트에서 작업중인 소스등을 편집하는데 터미널로 접속해 vim, nano 같은 편집 도구를 이용할 수 있지만, 개발 컴퓨터에서 손에 익은 GUI 개발 도구를에서 개발하고 편집해서, 원격 호스트에서 실행하는 방법을 선호해서 sshfs를 이용하고 있다.

보통 Sublime Text, TextMate 등의 에디터에서 파이썬 등의 프로그래밍 코드를을 작성하고 sshfs를 이용해 원격 디렉토리에 저장하는 방법을 사한다.

설치

Ubuntu/Debian

1
$sudo apt install sshfs

Mac OS X

Mac OS X Fuse 설치

sshfs 설치후 재시동 필요.

Window

다음 설치 파일을 받아 설치한다.
https://win-sshfs.googlecode.com/files/win-sshfs-0.0.1.5-setup.exe

Mac OS X 사용

Mac OS X에서는 OSXFuse를 사용해서 사용자 계정에서 sshfs를 이용한다. 그래서 sudo 명령을 사용하지 않는다.

1
$ sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

sudo 명령을 이용해서 마운트할 경우 마운트 포인트를 찾지 못해서 다음 같은 에러가 난다.

1
2
$ ls
ls: odoomodules: No such file or directory

Ubunto/Debian

1
sudo sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

사용후 언마운트는 다음과 같다.

1
$sudo umount /Volume/remote

마운트 고정: Mac OS X

https://amaral.northwestern.edu/resources/guides/mounting-remote-folder-os-x-over-ssh

파일 /etc/fstab

1
sshfs#USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote
DS_Store 파일

OS X는 파일을 다룰 때 .DS_Store 파일로 폴더를 지저분하게 한다. 이것을 비활성화 할 수 있다.
마운트할 때 noappledouble 옵션을 사용한다.

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

Mounting an OSX SSH Volume using FUSE and SSHFS

ssh authentication

1
sudo sshfs -o IdentityFile=~/.ssh/id_rsa USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

자주사용하는 sshfs 명령

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

sshfs options

sshfs 구현마다 조금 다르지만 https://linux.die.net/man/1/sshfs 에서 옵션 내용을 조금 살펴보자:

  • -o reconnect : reconnect to server
  • -o delay_connect : delay connection to server
  • o sshfs_sync: synchronous writes
  • -o no_readahead: synchronous reads (no speculative readahead)
  • -o sshfs_debug: print some debugging information
  • -o cache=BOOL: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N: sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N: sets timeout for {stat,dir,link} cache
  • -o workaround=LIST: colon separated list of workarounds
  • none: no workarounds enabled
  • all: all workarounds enabled

cache

느린 네트워크에서는 캐시를 끄고 사용하는게 좋겠다.

  • -o cache=YESNO: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N : sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N : sets timeout for {stat,dir,link} cache

보증된 네트워크에서 암호화 없이 mount

sshd 가 암호화를 지원하는 상황에서 안된다.

안전한 네트워크에서는 Ciphers, Compression 옵션을 사용 ^Blazingly fast sshfs 하면 빠른 속도를 얻을 수 있다.

1
sshfs -o Ciphers=arcfour -o Compression=no server://some/folder /mnt/some_local_folder
  • Ciphers=arcfour : 빠른 암호화 메서드, 다만 안전하지 않다.
  • Compression : ssh 내장 압축 사용하지 않는다.

rsync 에도 사용할 수 있다.

1
rsync -e"ssh -c arcfour -o Compression=no" ...rest of rsync cmd...

TCP Optimization

MTU(Maximum Transmission Unit)

네트워크 인터페이스에서 세그먼트 없이 보낼수 있는 최대 데이터그램 크기 값입니다. 만약 데이터가 MTU 값 이상이라면 여러개의 패킷으로 분할이 될 것입니다. 간단하게 보자면 MTU 는 패킷이 한번에 보낼 수 있는 최대 크기라고 볼 수 있습니다.

이더넷의 MTU 값은 일반적으로 1500 바이트이며 옛날에 모뎀을 통해 접속하던 PPPoE 연결은 1492 바이트를 가지고 있습니다.

MTU 는 각 패킷 프레임안에 최대 전송할 수 있는 값 MSS(Maximum segment size) 가 정의되어 있습니다. 그렇다면 MTU는 MSS + TCP/IP 헤더 크기가 될 것이고 반대로 MSS 는 MTU - 40 바이트가 됩니다. 40 바이트는 IP 와 TCP 헤더 20 바이트씩을 뜻합니다.

Linux

리눅스에서 MTU 값은 ifconfig 명령으로 확인할 수 있다.

1
2
3
4
5
6
7
8
9
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr b8:27:eb:c8:5f:4b
inet addr:220.121.140.239 Bcast:220.121.140.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fec8:5f4b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1633606 errors:0 dropped:44758 overruns:0 frame:0
TX packets:73808 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85875027 (81.8 MiB) TX bytes:22615535 (21.5 MiB)

기본 MTU가 1500인데 이 값을 조정하려면 sudo ifconfig 명령으로 할 수 있다.

1
$ sudo ifconfig eth0 mtu 9000

재시동 후에도 지속적으로 MTU 값을 유지하고 싶으면 /etc/network/interfaces 에 명시하면 된다.

1
2
3
4
5
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
mtu 9000
링크

MTU

SSHFS-MUX

http://www.linux-magazine.com/Issues/2014/165/SSHFS-MUX

Error

에러 mount_osxfuse: the file system is not available (255)

There appears to be a problem loading the KEXT installed by the regular osxfuse Homebrew package. You can use brew cask to install the official FUSE for OS X build from their own DMG:

1
2
3
brew rm osxfuse
brew install caskroom/cask/brew-cask
brew cask install osxfuse

참조

ssh 관련 사용 옵션

SSH Usages

Ssh timeout

ssh를 사용시 접속 시간이 지나면 자동 끎김을 막아주는 옵션들이 있다.

운영하는 서버는 보안상 alive 메시지를 모두 막아 두었다.
다만, ssh 접속시 ServerAliveInterval 을 사용해서 클라이언트가 alive 메시지를 서버에 있다.

sshd

sshd 데몬은 클라이언트 접속후 sshd_config에 구성한 설정데로 alive 메시지를 클라이언트에 주고 받아 접속 시간을 연장할 수 있다. 아래 그림 [^1]

1
2
3
4
5
6
7
8
9
10
11
# alive 메시지 사용 결정
#TCPKeepAlive yes # 기본 yes.

# 클라이언트가 살아있는지 확인하는 간격.
ClientAliveInterval 60 # 기본 0.
# 클라이언트에서 응답이 없을 때 메시지를 보내는 횟수
ClientAliveCountMax 3 # 확인 횟수

# Login Prompt에서 사용자 입력을 기다리는 시간을 초 단위로 입력.
LoginGraceTime 20 #( 1m: 기본 1분지정, 0은 시간제한없음)

ssh 옵션

ssh 사용시 /etc/ssh/ssh_config 구성 파일에 있는 ServerAliveInterval 옵션을 사용하면 ssh 접속시 alive 메시지를 서버가 클라이인트에게 주어진 시간 간격으로 보낸다.

[그림. ServerAliveInterval]

ssh_config 파일에 구성하거나 ssh 사용시 -o ServerAliveInterval 옵션을 사용하는 방법 두 가지가 있다.

ssh -o

ServerAliveInterval option every time you’re connecting to a server by using the -o ServerAliveInterval= prefix as the following example;

1
ssh -o ServerAliveInterval=300 user@example.com

key파일 사용

키파일 이용

키파일을 원하는 위치에 복사하고 퍼미션을 400으로 조정합니다. (저는 ~/Desktop/key/로 정했습니다.)

1
$ chmod 400 ~/Desktop/key/keyfile.pem

터미널에서 키파일 옵션을 추가한 명령으로 ssh 접속

1
$ ssh -i ~/Desktop/key/keyfile.pem ec2-user@[서버 아이피 또는 도메인]

포트가 다르다면

1
$ ssh -i ~/Docments/cloud-server.pem root@220.11.11.173 -p 8888

서버 키 생성

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@server"

scp -i /Documents/ncloud-key/qkbooo-ncloud.pem ~/.ssh/id_rsa.pub root@210.89.190.173:/ -p 2525

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

포트변경 사용

rsync 포트 사용

rsync에서 다른 ssh 포트를 사용하고 있을 경우 아래와 같이 옵션을 붙여준다.

1
$ rsync -e 'ssh -p 0000'

혹은

1
rsnyc --rsh'=ssh -p0000'

참조

[^1]: How to keep your ssh connection