SSH - 윈디하나의 솔라나라

목차

개요

SSH

ssh(1)은 SSH 클라이언트다. 기본적으로 필요하다고 생각되는 사항을 소개한다.

SSHD

SSHD 는 운영체제 설치시 이미 설치되어있고 정상적으로 사용 가능할 것이기 때문에 설치에 대한 사항은 생략한다. 몇가지 유용한 설정에 대해 설명한다.

SCP

scp(1)rcp(1)와 비슷한 원격 파일 복사 명령이다. 사용법 역시 ssh(1)와 비슷하며, 복사를 위한 옵션이 추가되어있다. 더 자세한 옵션은 scp(1)을 읽어보자.
scp [SSH옵션들] [-pqr] [[사용자명@]호스트명:]파일명1 [...] [[사용자명@]호스트명:]파일명2
root@wl ~ # mkfile 10m
root@wl ~ # scp 10m wl2:/root
암호:
10m                  100% |*****************************| 10240 KB    00:02
root@wl ~ #

SFTP

SSH KEYSCAN

공개키 인증

  1. 클라이언트 공개키 생성

    우선 클라이언트에서 개인키와 공개키를 생성하자.
    root@wl ~ # ssh-keygen -t dsa -b 1024
    공개/전용 dsa 키  쌍 생성중.
    키를 저장할 파일을  입력하십시오. (/root/.ssh/id_dsa):
    디렉토리 '/root/.ssh'를 만들었음.
    passphrase 입력 (passphrase가 없을 경우 비어 있음): *****
    동일한 passphrase를 다시  입력하십시오: *****
    귀하의 ID가 /root/.ssh/id_dsa에   저장되었습니다.
    귀하의 공개 키가 /root/.ssh/id_dsa.pub에   저장되었습니다.
    키 지문:
    f0:ce:f9:e9:84:a8:e2:3d:5f:f9:1c:7b:22:78:5e:b7 root@wl
    root@wl ~ # ls -al ~/.ssh
    -rw-------   1 root     root         744 11월  8일  22:41 id_dsa
    -rw-r--r--   1 root     root         597 11월  8일  22:41 id_dsa.pub
    root@wl ~ #
    
    위와 같이 하면 두개의 파일이 생성된다. id_dsa는 개인키, id_dsa.pub는 공개키를 담은 파일이다. -t는 암호화 방식을 나타내며 dsa외에 rsa를 선택할 수 있다. -b 이후의 숫자는 키 페어의 비트(기본값은 1024)를 나타낸다.
  2. 서버 공개키 복사

    클라이언트에서 생성한 공개키 파일(id_dsa.pub)를 서버에 복사한다.
    root@wl2 ~ # ls -al id_dsa.pub
    -rw-r--r--   1 root     root         597 11월  8일  22:46 id_dsa.pub
    root@wl2 ~ # mkdir ~/.ssh/
    root@wl2 ~ # mv id_dsa.pub ~/.ssh/authorized_keys 1)
    root@wl2 ~ # vi /etc/ssh/sshd_config 2)
    RSAAuthentication yes
    root@wl2 ~ # svcadm restart ssh 2)
    
    1) 공개키 파일을 별도로 지정하지 않았으면 ~/.ssh/authorized_keys파일을 읽도록 세팅되어있다. 바꿔 말하면 기본 설정으로는 시스템에 있는 사용자마다 각각 authorized_keys 파일을 설정해야 한다는 의미다. authorized_keys 파일을 열어보면 한줄로된 텍스트 파일인데, wl 이외의 곳에서도 wl2에 공개키를 이용해 접속하려면, authorized_keys 파일에 한줄씩 덧붙여 주면 된다.
    2) /etc/ssh/sshd_config에서 RSAAuthenticationyes로 되어있는지 확인한다. yes가 아니면 yes로 바꾸고 sshd를 재시작한다. (솔라리스에서는 yes가 기본값이다)
  3. 접속 테스트

    wl에서 모두 아래와 같이 접속 할 수 있다. wl2의 암호 대신, wl 에 생성한 키 파일의 암호문를 입력해야 한다.
    root@wl ~ # ssh wl2
    '/root/.ssh/id_dsa' 키에 대한 암호문을 입력하십시오. *****
    Last login: Sun Nov  8 22:53:55 2009 from wl
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    root@wl2 ~ #
    
  4. 암호문을 ssh-agent에 등록해 접속하기

    매번 암호문을 입력하는 것은 불편하기 때문에 아래와 같이 ssh-agent(1)를 이용해 암호문 입력 없이 접속할 수 있다. ssh(1) 뿐만 아니라 scp(1), sftp(1)에 대해서도 동일하게 작동한다.
    root@wl ~ # ssh-agent $SHELL 1)
    root@wl ~ # ssh-add ~/.ssh/id_dsa 2)
    /root/.ssh/id_dsa에 대한 암호문을 입력하십시오. *****
    ID 추가: /root/.ssh/id_dsa (/root/.ssh/id_dsa)
    root@wl ~ # ssh wl2
    Last login: Sun Nov  8 22:56:34 2009 from wl
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    root@wl2 ~ #
    
    1) 이렇게 하면 셸을 한번 더 실행하게 된다. eval `ssh-agent`도 하나의 방법이지만, 이경우 로그아웃 해도 ssh-agent(1)가 그대로 띄워져 있다. (eval을 이용하는 경우 로그아웃 스크립트에 eval `ssh-agent -k`을 사용하면 된다) 단순히 ssh-agent명령만 주면 아래와 같이 환경변수와 에이전트의 PID를 알려주는 스크립트를 출력한다.
    root@wl ~ # ssh-agent
    SSH_AUTH_SOCK=/tmp/ssh-oHMhD763/agent.763; export SSH_AUTH_SOCK;
    SSH_AGENT_PID=764; export SSH_AGENT_PID;
    echo 에이전트 pid 764;
    root@wl ~ #
    
    2) 만약 id_dsa 파일의 권한을 600 으로 설정하지 않았다면, 아래와 같은 메시지가 나오면서 키가 입력되지 않는다.
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         경고: 보호되지 않는 개인 키 파일!               @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    'id_dsa'에 대한 0644 권한이 너무 개방되어 있습니다.
    
  5. ssh-agent 로그인 스크립트

    키 파일을 등록하는 로그인/로그아웃 스크립트다. bash 에서 작동한다. 실행 스크립트의 위치에 대해서는 윈디하나의 솔라나라: Bash - 인터랙티브 로그인 셸(Interactive Login Shell)로 실행되는 경우을 읽어보자.
    root@wl ~ # vi ~/.profile
    ...
    if [ -f ~/.ssh/id_dsa -o -f ~/.ssh/id_rsa ]; then
    	eval `/usr/bin/ssh-agent`
    	/usr/bin/ssh-add
    fi
    root@wl ~ # vi ~/.bash_logout
    if [ "$SSH_AGENT_PID" != "" ]; then 
    	LANG=C; eval `/usr/bin/ssh-agent -k`
    fi
    root@wl ~ #
    
  6. Agent Forwarding(에이전트 포워딩)

    다음과 같이 wl 호스트에서 wl2 호스트를 경유해 wl3 호스트에 접속하는 상황을 가정해 보자.

    wl ←───→ wl2 ←───→ wl3
    

    wl을 통해 wl2에 접속하고 다시 wl2에서 wl3에 접속하는 상황을 가정해 보자. 이 경우 인증서를 이용해 접속하려면 wl과 wl2에서 키를 생성하고, wl의 공개키를 wl2에, wl2의 키를 wl3에 복사하고 설정해줘야 한다. 또한 wl2에 접속한 후 다시 ssh-agent를 실행해야 한다. 이런 불편함을 해소하기 위해 Agent Forwarding을 사용하자.

    아래의 예제를 따라하기 전에 wl의 공개키를 wl2와 wl3에 등록한다. (~/.ssh/authorized_keys에 복사해놓는다)

    root@wl ~ # vi /etc/ssh/ssh_config 1)
    ForwardAgent yes
    root@wl ~ # ssh wl2
    Last login: Sun Nov  8 23:29:10 2009 from wl
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    root@wl2 ~ # ssh wl3
    Last login: Sun Nov  8 23:29:13 2009 from wl
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    root@wl3 ~ #
    
    1) 클라이언트에 Agent Forwarding 을 활성화 해놓는다.

호스트 기반 인증

클라이언트 설정

root@wl ~ # vi /etc/ssh/ssh_config
Host *.solanara.net
	HostbasedAuthentication yes
	EnableSSHKeysign yes

서버 설정

root@wl2 ~ # vi /etc/shosts.equiv 1)
client1.example.org
192.0.2.102
client8.example.org -bull
@statcluster
wl
root@wl2 ~ # ssh-keyscan -t rsa wl >> /etc/ssh/ssh_known_hosts 2)
root@wl2 ~ # vi /etc/ssh/sshd_config 3)
HostbasedAuthentication yes
root@wl2 ~ # svcadm restart ssh 3)
1) rhosts.equiv 이기도 한다.
2) 클라이언트의 호스트 키를 저장해놓는다.
3) 호스트 기반 인증을 허용하고 sshd 를 재시작한다.

SSH 터널링

터널링 종류

터널링에는 로컬포트포워딩과 원격포트포워딩이 있다.
  1. 로컬포트포워딩(local port forwarding)

    로컬포트포워딩은 로컬의 특정 포트로 오는 트래픽을 원격호스트의 특정 포트로 포워딩해준다. ssh(1)-L 옵션을 붙여 실행하는 것으로 가능해진다.
    root@client ~ # ssh -L 1234:localhost:80 username@remotehost 1)
    Password: 
    
    1) client에 포트 1234를 열고, 이 포트로 오는 모든 트래픽은 SSH에 의해 암호화되어 remotehost로 전송되며, 다시 remotehost입장에서 localhost의 포트 80번으로 포워딩된다. usernmaePasswordremotehost의 것을 입력해야 한다. SSH에 접속 한 동안만 포워딩 된다.
  2. 원격포트포워딩(remote port forwarding)

    원격포트포워딩은 원격 호스트의 특정 포트로 오는 트래픽을, 로컬의 특정 포트로 포워딩해준다. ssh에 -R 옵션을 붙여 실행하는 것으로 가능해진다.
    root@client ~ # ssh -R 1234:localhost:23 username@remotehost 1)
    Password: 
    
    1) remotehost에 포트 1234를 열고, 이 포트로 오는 모든 트래픽은 SSH에 의해 암호화되어 client로 전송되며, 다시 client 입장에서 localhost23번 포트로 포워딩 된다. usernmaePasswordremotehost의 것을 입력해야 한다. SSH에 접속 한 동안만 포워딩 된다.
  3. X11 포워딩

    SSH의 X11 Forwarding을 사용해 원격의 X윈도 패킷을 로컬의 X윈도로 쉽게 포워딩할 수 있다.

    ※ 서버 설정
    root@sshdserver ~ # vi /etc/ssh/sshd_config 1)
    X11Forwarding    yes
    X11DisplayOffset  10
    X11UseLocalhost  yes
    root@sshdserver ~ # svcadm restart ssh
    
    1) 설정을 확인해본다. 이미 되어있다면 수정할 필요 없다.
    ※ 클라이언트에서는 아래와 같이 사용한다.
    root@client ~ # ssh -X username@sshdserver 1)
    암호:
    Last login: Mon Apr 13 09:00:00 2009 from 192.168.0.x 2)
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    root@sshdserver ~ # xclock & 3)
    [xxxx]
    root@sshdserver ~ #
    
    1) -X 옵션을 주면 된다.
    2) 접속한 호스트의 로그인 스크립트에서, DISPLAY환경변수를 설정하면 안된다.
    3) xclock을 띄워본다. client호스트의 X윈도우에 sshdserver호스트에서 실행한 시계가 뜨면 정상적으로 접속된 것이다.

예제


【Client】←───인터넷───→【SSHDServer】←─→【Appserver】
    │                                  │
    └────────────방화벽에의해차단됨─────────────┘
root@client ~ # ssh -L x:appserver:y username@sshdserver
Password:
root@sshdserver ~ #

client에서 다른 세션으로 아래와 같이 접속한다.
root@client ~ # telnet localhost x 1)
1) 만약 아래와 같은 오류가 난다면, sshdserversshd_config설정을 확인해본다.
channel n: open failed: administratively prohibited: open failedsshd_configAllowTcpForwarding설정 확인
channel n: open failed: connect failed: connection refusedsshd_configGatewayPorts설정 확인

SSH 프록시

접속

root@client ~ # ssh -D 1234 username@sshdserver 1)
Password: 
root@sshserver ~ #
1) client서버에 1234포트를 열고 이 포트로 SOCKS 프로토콜과 호환되는 데이터가 전송되면, SOCKS 데이터를 sshdserver로 전송해, sshdserver에서 SOCKS 규격에 맞춰 데이터를 처리한다.

어플리케이션 설정

RSS ATOM XHTML 5 CSS3