SSH - WindyHana's Solanara

목차

개요

SSH

SSHD

SCP

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 1.0 CSS3