SSH 비밀번호 없이 접속하기 (ssh-keygen)

호스팅 서버 작업을 ssh로 한다거나, 특정 서버에 ssh를 통해 자주 접속하는 경우 비밀번호를 매 번 입력하는 것은 귀찮은 일이다. scp 커맨드로 파일들을 여럿 복사한다거나 한다면 더더욱 그렇다. 또 중간에 비밀번호를 물어보면 쉘 스크립트 안에 넣을 수 없기 때문에 불편하기도 하다.

그런데 key 교환을 미리 해 두어 비밀번호 입력을 건너뛰는 방법이 있다. ssh 클라이언트의 public key를 서버에 authorized_keys 라는 파일에 미리 기록해두면 동작한다.

먼저 클라이언트에 key 파일이 존재하는지 확인한다. ~/.ssh/ 디렉토리에 id_rsa 라는 파일이 있다면 이미 키는 존재하는 것이므로 아래 과정은 건너뛴다. 없다면 다음과 같이 ssh-keygen 커맨드를 통해서 key를 생성해준다.

imac:~ cky$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/cky/.ssh/id_rsa): <그냥 엔터>
Enter passphrase (empty for no passphrase): <그냥 엔터>
Enter same passphrase again: <그냥 엔터>
Your identification has been saved in /Users/cky/.ssh/id_rsa.
Your public key has been saved in /Users/cky/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:cwHYDEvfZW8SL1tAr4HsX3XWkukhQBrdjPYRbkq+eC0 cky@imac.local
The key's randomart image is:
+---[RSA 2048]----+
|      o=ooo=B.   |
|     ..oo*+*+* o.|
|      . o.*.B.@ =|
|         + +.@ =.|
|        S = o o  |
|         + + .   |
|        . E o    |
|         . .     |
|                 |
+----[SHA256]-----+

다음으로 서버에 public key를 넣어준다. 서버에 접속한 후 ~/.ssh/ 디렉토리에 authorized_keys라는 파일이 있는지 찾는다. 해당 파일에 클라이언트의 id_rsa.pub 파일 내용을 넣어주면 된다. 아래와 같은 형식으로 저장이 되면 된다.

host:.ssh cky$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9PGkVPrUxg59mw2wwOuePjnhx3Xu09iqyTPvpKlcxI43osWE1DwxwLcHdxZn7hbWU48yIF2qguI15RXucYuoy+gzmnN5b2L5T9vUxSYzwGTicgpU3JJImjvRDpdakqtqdodjXFtJEruvZ81BcKbL3F9TMC6+onaQf2DtZaIVZqDOsEHL4pUeAl7hMtDoAakYmUGPysQWjnVFNdkjfei3jiojMUrED6GeqG1SOv1etQM9qDDRX+RR6CjNVsJhAHpmLDoAJdJD6p/s/c4CYK89Rc1mTccdwJO8zaJDe280Ylp7AjNvZkox1UhWOZT0KQfHCgT+Mj0e6u423XwN71ZeB cky@imac.local
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQJW8NidufUidueieNoPvm1Z7iK1Yd595Yk90bvSYl775CJ/Dm1ejHxO/Fvs00lsKOgvYrTlCFA7eODYi5URFB/U3OUjfLFfstLekkk53DTx2Br2NUJPymc0MevroRwm0s17R+35uxqv8BD8aB/U7MFOooQQgh3QxyTcKTvMnzXLbjjhNsBZTbm/mUwoV63Snceg+XaEU476WP3M0XTRiIv1sQ1FO+3jO/R+V93X5WPrPRCMKavaTir+7DUFzcFH/ZOyAL82PV9vbJO4ox4Mq24DIwZio78UKwaVlNbssH+dHU8r8aVR2xvFVXYNs2pyFfmQTnbzaN8YVtbh86mHJL pi@raspberrypi
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9ARQI5M7F05QWwt5flzIfhP7rkoeZgGgIDPWILKcDKFXHSn6YQ7pnpibds9twa0J0iXj5Rkn6JbIUwKKNF89IqLpusd8IufM/XblzoUpCGSwg8UETQvdEDyY4hYxBnlT+jGKxbf6TgQHUy0sG2B0ctDi4+eFhAfOSiMSAP2UF6BqVrNTOx2PD8WqR8EzpzONivQtE0d3Ob9ueHdhHY9G9Oug+JMMb8MbjfkeowuU89Mw/m4dr10DE6tksPKXb7k03dfXbu5mDXsCIr8+IM1B1gl27BSlvjG7AwTbPHXHORK9XYgodY3eo4WyEWU4cFBXwZFFMJv6gfnAIjcgZKOT7 root@raspberrypi

이제 다 되었다. 연결을 끊은 다음 다시 접속해보면 패스워드를 묻지 않고 바로 프롬프트가 뜬다. 🙂

라즈베리파이 모니터 없이 최소 설치

호스팅을 직접 라즈베리파이에 해 보면 어떨까 싶은 마음에 사용하지 않고있던 라즈베리파이2를 꺼내보았다. 웹 서버를 운용할 것이라서 데스크탑 환경은 필요가 없기 때문에 무작정 RASPBIAN JESSIE LITE 버전을 다운로드하여 MicroSD 카드에 이미지를 풀어냈다.

시행 착오 및 검색을 통해 부팅 전 다음과 같은 사항이 필요하다는 것을 알아냈다.

Raspberry Pi

고정 IP

모니터, 키보드는 연결하지 않을 것이므로 항상 동일한 IP를 갖도록 하는 것이 필요했다. boot 파티션에 보면 cmdline.txt 라는 파일이 있는데, 이를 열어 ip=xxx.xxx.xxx.xxx를 입력해주면 된다.

pi@raspberrypi:/boot $ cat cmdline.txt 
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes ip=10.0.1.100 rootwait

SSH enable

기본적으로 LITE 이미지는 ssh가 disable 되어있다. 이를 enable 하기 위해서는 boot 파티션에 ssh 라는 이름의 빈 파일을 넣어주면 된다. touch ssh 식으로 하나 만들어준다.

위와 같이 두가지 설정을 해 주면 ssh를 통해서 라즈베리파이에 접속할 수 있다. 기본 계정은 pi/raspberry 이다. 접속 후 패스워드를 변경해주고 apt-get update/upgrade를 먼저 해 둔다.

이제 APM을 설치하여 웹서버를 운용하면 된다.

ssh 먹통된 경우 종료 하는 방법

ssh 사용 중 network 문제라던가 입력이 아무 말도 듣지 않는 경우가 발생할 때가 있다. 이 때 ctrl + D, ctrol + Z, ctrl + C가 다 듣질 않는다.

쉘을 하나 더 띄워 kill -9 명령으로 ssh 프로세스를 종료할 수도 있지만, 간단하게 종료시키는 방법이 있어서 소개한다.

ssh client가 지원하는 이스케이프 시퀀스가 몇 개가 있는데, 그 중에 하나가 terminate session이다. 이는 Enter, ~, .(마침표) 를 연달아 누르면 된다.

Enter, ~, ? 를 입력하면 사용할 수 있는 커맨드를 나열해준다.

Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

HTTP proxy를 통한 ssh 연결 방법

뜻이 있는 곳에 길이 있다고.. proxy에 막혀 아무것도 할 수 없는 상황에서 http proxy를 통해서 외부로 연결할 수 있는 방법이 있다는 것을 알았다.

사용할 수 있는 기본 환경은 이렇다.

  1. 22번 포트가 막혀있다. (아마 다른 대부분의 포트가 막혀있다.)
  2. Browser에 http proxy 설정을 해야 web 서핑을 할 수 있다.
  3. 리눅스를 쓴다.

서버 설정

서버 설정은 별다른게 없다. sshd를 22번으로 열어놔도 괜찮고, 혹시 22번 포트 검사를 할까 싶으면 443번 포트로 sshd를 열어둔다. (https로 속아줄지도 모르니까..) 또는 공유기에서 443 -> 22로 포트포워딩을 추가해도 된다.

특정 장소에서

리눅스에서 필요한 패키지를 설치한다.

$ sudo apt-get install corkscrew

그리고 ~/.ssh/config 파일에 다음과 같은 라인을 추가해준다.

host my.host.com
	ProxyCommand /usr/bin/corkscrew proxy.server.com [proxy_port] %h %p

이렇게 설정한 후에 ssh my.host.com 이라고 입력하면 22번 포트로 my.host.com에 연결이 된다. (my.host.com에 연결할 때만 이렇게 proxy를 사용한다.) 혹시 443번 포트로 변경을 했다면 ssh my.host.com -p 443 이라고 입력하면 된다.

ssh 연결이 되었으니 -D 옵션을 사용하여 포트 포워딩은 덤으로 할 수 있다. 이제 특정 장소의 방화벽을 우회하여 어디든 접속할 수 있다. 🙂

라즈베리파이 ssh, ftp 환경 설정

Raspbmc를 설치하면 dropbear ssh server와 vsftpd 데몬이 함께 설치가 된다.

처음으로 ssh 접속을 하면 locale과 time zone을 설정하는 과정을 거친다. 다음 세 개의 로케일을 선택하였고, ko_KR.UTF-8을 기본 locale로 설정했다. Time zone은 Asia -> Seoul로…

en_US
en_US.UTF-8
ko_KR.UTF8

먼저 패스워드를 변경한다. 기본적으로 할당되어있는 pi 계정의 기본 패스워드는 raspberry인데, 이것을 자신만 아는 비밀번호로 변경한다.

pi@raspbmc:~$ passwd
pi에 대한 암호 변경 중
(현재) UNIX 암호:
새 UNIX 암호 입력:
새 UNIX 암호 재입력:
passwd: 암호를 성공적으로 업데이트했습니다

그 다음 한글을 입출력할 수 있게 설정해준다.

pi@raspbmc:~$ cat .profile 
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
sudo sh /scripts/configure-pi-user.sh

# cky
export LANG=ko_KR.UTF-8</pre>
<pre class="lang:default decode:true">pi@raspbmc:~$ cat .inputrc 
set meta-flag on
set convert-meta off
set input-meta on
set output-meta on

기본적으로 동일 망에서는 아무 제약없이 사용할 수 있지만 외부 망에서 접속하려고 하면 몇가지 수정해줘야 할 것들이 있다.

Raspbmc Settings

프로그램 -> Raspbmc Settings에서 위와 같이 Disable firewall을 체크해준다. 그렇지 않으면 동일 망에서만 라즈베리 파이에 접속할 수 있게 된다.

그리고 vsftpd 설정파일(/etc/vsftpd.conf)에 다음의 값을 추가해준다. 아래 설정이 없으면 접속 후 ls 했을 때 425 Security BAD IP 에러를 만나게 된다. pasv 관련 설정은 port forwarding 상황에 따라서 적당히 추가해주면 된다.

pi@raspbmc:~$ cat /etc/vsftpd.conf
listen=NO
pam_service_name=ftp
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=NO
connect_from_port_20=YES
ftpd_banner=Raspbmc FTP Server
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
# cky
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=29000
pasv_max_port=29999

Raspbmc 자체가 깔끔하게 정리가 되어있기 때문에 별다른 설정은 건드릴 필요가 없다. 🙂

ps. 추가로 Cronjob scheduler enable, Samba Server는 disable로 설정해서 사용중이다. cron은 주기적인 작업에 유용하게 사용할 수 있고, samba대신에 afp를 사용하도록 설정.