WindyHana's Solanara: SSH

목차

개요

SSH

SCP

rcp와 비슷한 명령이다. 사용법 역시 비슷하다.
scp [[사용자명@]호스트명:]파일명1 [...] [[사용자명@]호스트명:]파일명2
root@wl ~ # mkfile 10m
root@wl ~ # scp 10m wl2:/root
암호:
10m                  100% |*****************************| 10240 KB    00:02
root@wl ~ #

SFTP

root@wl ~ # sftp 사용자명@호스트명
암호:
sftp> ?
사용할 수 있는 명령:
cd 경로                       원격 디렉토리를 '경로'로 변경
lcd 경로                      로컬 디렉토리를 '경로'로 변경
chgrp 그룹 경로               '경로' 파일 그룹을 '그룹'으로 변경
chmod 모드 경로               '경로' 파일의 권한을 '모드'로 변경
chown 소유 경로               '경로' 파일의 소유자를 '소유자'로 변경
help                          해당 도움말 텍스트 표시
get 원격 경로 [로컬 경로]     파일 다운로드
lls [ls 옵션 [경로]]          로컬 디렉토리 목록 표시
ln 이전 경로 새 경로          원격 파일 Symlink
lmkdir 경로                   로컬 디렉토리 만들기
lpwd                          로컬 작업 디렉토리 인쇄
ls [경로]                     원격 디렉토리 목록 표시
lumask umask                  로컬 umask를 'umask'로 설정
mkdir 경로                    원격 디렉토리 만들기
put 로컬 경로 [원격 경로]     파일 업로드
pwd                           원격 작업 디렉토리 표시
exit                          sftp 종료
quit                          sftp 종료
rename 이전 경로 새 경로      원격 파일 이름 재지정
rmdir 경로                    원격 디렉토리 제거
rm 경로                       원격 파일 삭제
symlink 이전 경로 새 경로     원격 파일 Symlink
version                       SFTP 버전 표시
!명령                         로컬 쉘에서 '명령' 실행l
!                             로컬 쉘로 가기
?                             해당 도움말 텍스트 표시
sftp> ls -l
...
-rw-r--r--    0 0        0         1048576  sftptest
...
sftp> get sftptest
/root/sftptest을(를) tftptest(으)로 불러오는 중입니다.
sftp> exit
root@wl ~ #

공개키에 의한 인증

  1. 공개키 생성

    wl에서 wl2로 접속할 때 공개키를 사용해 인증 하려면, 개인키(Private Key)와 공개키를 생성하고, wl에는 개인키를, wl2는 공개키를 가지고 있어야 한다.
    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 1)
    RSAAuthentication yes
    root@wl2 ~ # svcadm restart ssh
    
    1) 공개키 파일을 별도로 지정하지 않았으면 ~/.ssh/authorized_keys 파일을 읽도록 세팅되어있다. 바꿔 말하면 기본 설정으로는 시스템에 있는 사용자마다 각각 authorized_keys 파일을 설정해야 한다는 의미다. authorized_keys 파일을 열어보면 한줄로된 텍스트 파일인데, wl 이외의 곳에서도 wl2에 공개키를 이용해 접속하려면, authorized_keys 파일에 한줄씩 덧붙여 주면 된다.
    2) [RSAAuthentication] 이 yes로 되어있는지 확인한다. yes가 아니면 yes로 바꾸고 ssh를 재시작한다. (솔라리스에서는 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를 이용해 암호문 입력 없이 접속할 수 있다. ssh뿐만 아니라 scp, sftp에 대해서도 동일하게 작동한다.
    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가 그대로 띄워져 있다. (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 에서 작동한다.
    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에 접속하고 다시 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
    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 ~ #
    

SSH Tunneling(터널링)

터널링 종류

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

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

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

    X11 Forwarding은 SSH에서 간편하게 X윈도를 포워딩해 로컬로 연결해준다. -L이나 -R로 할 필요 없이 -X 옵션만 주면 된다. (DISPLAY 환경변수를 설정하지 않는다)
    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
    암호:
    Last login: Mon Apr 13 09:00:00 2009 from 192.168.0.x
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    root@sshdserver ~ # xclock & 1)
    [xxxx]
    root@sshdserver ~ #
    
    1) 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) 만약 아래와 같은 오류가 난다면, [sshdserver]의 sshd_config 설정을 확인해본다.
channel n: open failed: administratively prohibited: open failed → sshd_config의 AllowTcpForwarding 설정 확인
channel n: open failed: connect failed: connection refused → sshd_config의 GatewayPorts 설정 확인

기타 SSH옵션

SSH Proxy(프록시)

접속

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

어플리케이션 설정

Twitter RSS IconTexto 올바른 XHTML 1.0 Transitional 입니다 올바른 CSS입니다!