ssh(Secure Shell)
SSH(Secure Shell)은 네트워크의 다른 컴퓨터에 로그인 할 수 있으며 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 프로그램이다
강력한 인증방법과 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공해 준다.
SSH는 두 호스트간의 통신 암호화와 사용자 인증을 위하여 공개 열쇠 암호 기법을 사용한다. 즉, telnet,rlogin,rcp,ftp,pop등과 비교해 보면 이들은 스니퍼(NetWorek 상에서 패킷을 Capturer 하기 위한 해킹툴)를 당하면 입력 문자 그대로 패킷이 쉽게 노출된다..
이에 반해 ssh는 이 모든 문자들을 암호화 하여 비록 노출이 된다 하더라도 이해할 수 없는 암호화된 문자로 나타나게 되는 것입니다. 또 IP스푸핑, DNS 스푸핑등으로부터 SSH를 사용하면 보호가 가능하다.
세션 하이젝킹(Session Hijacking)과 DNS 스푸핑을 방지해 주면서 원격 호스트에 로그인 하거나 호스트끼리 데이터를 복사하기 위해 사용될 수 있다.
일반 login프로그램들이 packet을 전송할 때 암호화 되지 않은 Test(PlanText)으로 전달 하는과 달리 ssh는 packet자체를 암호화를 하여 보내기 때문에 원격 관리의 보안이 매우 안정적이다.
SSH는 RSA공개키/개인키 방식을 이용하여 암호화 하게 되는데 Secure ID, S/Key, Kerberos and TIS 역시 지원한다.
또한 SSH 는 X11서버와 연결도 지원 하므로 접속한 서버의 X프로그램 또한 실행 가능하게 해줍니다. 그리고 파일 전송등 현재는 sftp까지 지원을 하고 있으며, SOCKS 도 지원한다.
현재는 ssh1과 ssh2가 나와 있는데 ssh1은 공개로 자유롭게 사용가능하지만 ssh2는 비상업적인 경우에만 자유롭게 사용할 수 있는 라이선스 제한을 가하고 있다.
▶ ssh2 license
여기서는 유닉스에서의 라이센스 적용에 대해서 다루고자 한다.
www.ssh.com/products/ssh/ssh_license_agreement.html
위 링크에 라이센스에 대한 구체적인 사항이 나온다.
요약하면 리눅스,FreeBSD,NetBSD,OpenBSD에서 ssh2를 사용하고자 한다면 상용이든 그렇지 않든 관계가 없다. 윈도용은 30일 평가 버전이 존재하며 사용하기 위해서는 라이센스에 따른 비용을 지불하여야 한다. 이글의 라이센스 다른 웹페이지나,ftp등에 이 글을 그대로 기재할수 있다. 그러나 종이나 여타 인쇄매체를 사용할 시에는 이 내용들을 인용만 해야 한다. 즉 참고만 가능하다.
▶ ssh의동작
다음과같은 2쌍의 RSA key를사용하여동작한다.
◎ 클라이언트의개인키와공개키( authentication 에사용 )
user try to authenticate -> sever checks matching public keys ->
send challenge to the user -> user sign the challenge using the private key ->
return signed challenge to the server
◎ host 의개인키와공개키 ( login또는 connect된컴퓨터(host)가실제 connect
하려고했던컴퓨터인지를확인하는데사용)
host's identification changed -> issues warning
-> disable password authentication
1) ssh 설치
OpenSSH는 설치시 OpenSSL(www.openssl.org)이나 SSLeay를 필요로 한다.
여기서는 OpenSSL을 사용하겠다. SSL(Secure Socket Layer)은 암호화관련라이브러리라고 생각하면 되겠다. 나중에(?) https://으로 시작하는 보안걸린 웹페이지를 만들때도 사용된다.
▶ OpenSSL설치
OpenSSH를 설치전 먼저 OpenSSL을 설치해야 한다.
전형적인 유닉스 설치방법인 configure, make, make install만 해주면 끝이다.
ssh 소스파일 http://www.ssh.com에서 받을수 있습니다.
## cd ssh-3.0.1.tar.gz
# ./configure (configuration)
# make
# make install (루트계정으로 이 명령을 실행해야 한다)
ssh2(ssh-3.0.1.tar.gz)를설치하게되면다음과같은디렉토리에
프로그램이생성된다.
▶ /usr/local/sbin
sshd2 : server demon 프로그램
▶ /usr/local/bin
ssh2 : ssh의클라이언트프로그램
ssh-keygen2 : 키생성유틸리티
ssh-agent2 : authentication 에이전트
ssh-add2 : authentication 에이전트에 identities 추가한다
sftp : secure ftp
sftp-server : sftp server(sshd2에의해실행된다)
scp2 : secure rcp
▶ /etc/ssh2
hostkey : host의비밀키 개인 키이며 보안에 조심해야 하는 파일
hostkey.pub : host의공개키
ssh2_config : ssh 클라이언트의 설정파일로 실제로 ssh1과 호환할 필요
가 없으면 신경쓰지 않아도 된다.
sshd2 _config : ssh demon의 설정 파일입니다.
▶ ~/.ssh2
id_dsa_1024_a : 1024 비트비밀키
id-dsa-1024_a.pub : 공개키
authorization : server측에생성 (클라이언트의공개키파일에대한정보)
identification : 클라이언트측에생성 ( 클라이언트의개인키파일에대한정보)
random_seed
manager:/etc/ssh2 % ls
./ hostkey.pub ssh_dummy_shell.out
../ random_seed sshd2_9999.pid
hostkey ssh2_config sshd2_config
▶/home/SHELL/.ssh2/hostkeys
key_22_210.100.93.42.pub (클라이언트(IP address 210.100.254.13) 측의호스트 공개키즉 user 측컴퓨터의 /etc/ssh2/host.pub의값, 클라이언트가처음 server 에 login할때 server측에전달된다. ) 각 file들을 설명하자면 hostkey는 말그대로 host를 나타내는 privite key이며 보안에 아주 신경을 써야 하는 파일이다. hostkey.pub는 말그대로 host를 나타내는 공개 key입니다. ssh2_config는 ssh client의 설정 file이며, 실제로 ssh1과의 호환을 고려하지 않는다면 손을 델 필요가 없습니다. sshd2_config는 ssh daemon의 설정 파일이면, 한가지의 설정만 빼고는 ssh1과의 호환을 고려하지 않느다면 특별히 ssh2_config역시 손을 볼 것은 없다고 생각된다
2) ssh 서버 설정하기
manager:/etc/ssh2 % vi sshd2_config
## SSH CONFIGURATION FILE FORMAT VERSION 1.1
## REGEX-SYNTAX egrep
## end of metaconfig
## (leave above lines intact!)
## sshd2_config
## SSH 3.0 Server Configuration File
##
## 공통설정
# VerboseMode no
# QuietMode yes
# ForcePTTYAllocation no
# SyslogFacility AUTH
# SyslogFacility LOCAL7
## SSH1 compatibility (ssh1 호환성)
# Ssh1Compatibility
# Sshd1Path
==> 위의 두line은 ssh1과의 호환 부분이다. 여기서는
생략한다. SSH1 로의 접속이 요구 된다면 openssh 를 사용하는
것을 권장한다. openssh 는 동시에 ssh1, ssh2 를 지원한다
# This is given as argument to sshd1 with "-f" if sshd2 is invoked
# with "-f"
# Sshd1ConfigFile /etc/sshd_config_alternate
## Chrooted environment
# ChRootUsers ftp,guest
# ChRootGroups guest
sftp 를 이용하여 작업을 할 경우 지정된 유저는 자신의 홈계정
이상으로 올라가지 못한다. Chroot환경을 사용하는 방법은 뒤에
서 따로 다루도록 하겠다.
## subsystem definitions
# Subsystem's don't have defaults, so this is needed here (uncommented).
subsystem-sftp sftp-server
# Network 설정
# Port is not commented out, as it is needed by the example startup
# scripts. Well, the default won't likely change.
Port 22
=> ssh가 사용할 port를 지정해 준다. 변경 필요성은 별로 없다.
# ListenAddress 0.0.0.0
=> sshd가 귀를 기울일 주소를 정해준다. 0.0.0.0은 모든 곳으로
부터 접속을 받아들이겠다는 의미이다. 하지만 패키징을 할때
어떻게 한것인지는 모르겠지만 tcp-wrapper의 영향을 받아서
hosts.deny에서 막혀 있으면 접속이 안되니 hosts.allow와
hosts.deny에서 sshd2 항목으로 제어를 할수가 있다.
# RequireReverseMapping no
=> 접속하는 곳의 도메인이 Revers Mapping이 되는지를 확인하여 접속을
허가할지 안할지를 지정한다. 실제로 internet상에 호스트들중
revers mapping이 안되는 host가 상당히 많으며 또한 여러분이 사용하는
host중에도 revers mapping 이 안되는 host이 대다수이니 no로
설정을 하는 것이 낳을듯 하다. 자신의 host들이 revers mapping이 되는
것이 확실하다면 보안상 yes로 하는 것이 좋을수도 있다.
단 revers mapping이 안되면 접속이 안된다는 것을 명심하자
# MaxBroadcastsPerSecond 0
# MaxBroadcastsPerSecond 1
# NoDelay yes
# KeepAlive yes
# MaxConnections 50
# MaxConnections 0
=> 최대 몇개의 접속을 허락할지를 지정합니다. 0은 제한을 하지 않는다는 것
을 의미합니다.
# 0 == number of connections not limited
## Crypto
# Ciphers AnyCipher
# Following includes "none" 'cipher':
# Ciphers AnyStd
## Ciphers AnyStdCipher
# Ciphers 3des
=> 세션을 암호화 할 때 사용할 방법을 명시해 줍니다
(idea,des,3des,blowfish,arcfour 또는 없음)
# Following includes "none" 'mac':
# MACs AnyMAC
#
# MACs AnyStd
# MACs AnyStdMAC
# RekeyIntervalSeconds 3600
## User(사용자 설정)
# PrintMotd yes
==> login 을 한 후에 /etc/motd file 을 출력 할 것인지의 여무를 지정한다
# CheckMail yes
==> login 을 한 후에 SHELL 상에서 메일 도착 여부 체크 설정을 지정한다.
# UserConfigDirectory "%D/.ssh2"
==> user들의 정보가 들어 있는 directory를 지정한다.
# UserConfigDirectory "/etc/ssh2/auth/%U"
# UserKnownHosts yes
# LoginGraceTime 600
# PermitEmptyPasswords no
# StrictModes yes
# IdleTimeOut 1h
## User public key authentication
# HostKeyFile hostkey
# PublicHostKeyFile hostkey.pub
# RandomSeedFile random_seed
# IdentityFile identification
# AuthorizationFile authorizaj\tion
# AllowAgentForwarding yes
## Tunneling
# AllowX11Forwarding yes
# AllowTcpForwarding yes
# AllowTcpForwardingForUsers sjl, cowboyneal@slashdot\.org
#
# DenyTcpForwardingForUsers 2[[:isdigit:]]*4,peelo
# AllowTcpForwardingForGroups priviliged_tcp_forwarders
# DenyTcpForwardingForGroups coming_from_outside
## Authentication
## Hostbased and PAM are not enabled by default.
# BannerMessageFile /etc/ssh2/ssh_banner_message
# BannerMessageFile /etc/issue.net
# PasswordGuesses 3
==> 인증에 실패했을때 몇번까지 재시도할수 있는지를 지정한다.
# AllowedAuthentications hostbased,publickey,password
# AllowedAuthentications publickey,pam-1@ssh.com
# AllowedAuthentications publickey,password
==> 인증 순서를 지정한다.
# RequiredAuthentications publickey,password
==> 공개키를 이용하여 인증을 하려면 위설정의 주석을 풀어준다.
# HostbasedAuthForceClientHostnameDNSMatch no
# SshPAMClientPath ssh-pam-client
## Host restrictions
# AllowHosts localhost, foobar.com, friendly.org
#
## Next one matches with, for example, taulu.foobar.com, tuoli.com, but
## not tuoli1.com. Note that you have to input string "\." when you want it
## to match only a literal dot. You also have to escape "," when you
## want to use it in the pattern, because otherwise it is considered a list
## separator.
## AllowHosts => Ssh 서비스에 접근가능한호스트 명시 (예 : AllowHosts
shell.ourcompany.net) 호스트는 IP를 스거나 호스트명을 쓸 수 있으며 와일드카드가 지원되고 공백문자로 호스트를 구분합니다.
## AllowHosts t..l.\..*
## The following matches any numerical IP-address (yes, it is cumbersome)
##
## AllowHosts ([[:digit:]]{1\,3}\.){3}[[:digit:]]{1\,3}
# Same thing is achieved with using the special prefix "\i" in a
## pattern. This means that the pattern is only used to match
## IP-addresses.
##
## Using the above example:
##
## AllowHosts \i.*
##
## You can probably see the difference between the two.
##
# DenyHosts evil\.org, aol\.com
DenyHosts : 명시된 호스트는 ssh서비스에 접근할 수 없도록 하는 기능(Deny Hosts
shell.ourcompany.net).호스트 IP를 쓰거나 호스트 명을 쓸 수 있으며 와일드 카드가
지원되고 공백 문자로 호스트를 구분합니다.
# AllowSHosts trusted\.host\.org
AllowSHosts : .shosts나 .rhosts에 있는 호스트들 중에서 shd서비스를 접근할 수 있는 호스트를 명시. 호스트는 IP 를 스거나 호스트명을 쓸 수 있으며 와일드카드가 지원되고 공백 문자로 호스트를 구분합니다.
# DenySHosts not\.quite\.trusted\.org
# IgnoreRhosts no
# IgnoreRootRHosts no
## 위의 설정이 되어 있지 않으면 기본값으로 IgnorRhosts 값을 가진다.
## 유저 제한
# AllowUsers sj.*,s[[:isdigit:]]*,s(jl|amza)
# DenyUsers skuuppa,warezdude,31373
# DenyUsers don@untrusted\.org
# AllowGroups staff,users
AllowGroups : ssh 로그인을 해당 그룹으로 제한한다. 각각의 그룹명은 공백으로 구분한다. 와일드 카드(* 와 ?)를 사용할수 있다.
# DenyGroups guest
DenyGroups : AllowGroups의 반대 역할을 한다. 지정된 그룹은 로그인이 거부된다.
# PermitRootLogin nopwd
# PermitRootLogin yes
==> root로의 login 허락 여부를 지정한다.
3) 사용자 개인 설정
------------------------------
1. 비밀번호에 의한 인증/접속
------------------------------
manager /export/home/opsign 8 % ssh remote.host 또는
manager /export/home/opsign 8 % ssh remote.host -l username
타겟서버에 비밀번호를 입력하고 접속한다.
접속했던 호스트 정보는 ~/.ssh/known_hosts 에 남는다.
** 비밀번호에 의한 인증 접속만 이용한다면 아래부분의 RSA 키값을 만들 필요가 없다
------------------------------------
2. 암호문구(passphrase)에 의한 접속
------------------------------------
암호문구에 의한 접속은 비밀번호 대신에 암호문구를 사용하며, 암호없이 로그인할 수도
있다.
manager /export/home/opsign 8 % ssh-keygen
로컬서버의 공개키를 만든다.
RSA키를 만들면서 암호문구를 입력하면 ~/.ssh 폴더에 1024비트의 개인키(identity)와 공개키(identity.pub)가 만들어 진다. 암호문구는 ssh 접속할 때 비밀번호 대신 사용한다.
4) 하고자 하는 작업예 )
local 컴퓨터에서 whoami 컴퓨터의 young이란 유저가 시스템의 패스워드를 사용하지 않고
local young user의 공개키 (Public key) 를 사용하여 접근한다.
local 에서 공개키와 개인키를 생성한다.
[young@local .ssh2]$ ssh-keygen2
Generating 1024-bit dsa key pair
10 Oo.oOo..oOo.
Key generated.
1024-bit dsa, young@local, Sun
Jan 28 2001 22:28:13 +0900
Passphrase :
Again :
Private key saved to
/home/young/.ssh2/id_dsa_1024_a
Public key saved to
/home/young/.ssh2/id_dsa_1024_a.pub
[young@local .ssh2]$
Passphrase: ->이곳에 패스워드를 입력한다.
Again : -> 다시 입력확인..
생성된 파일들..
[young@local .ssh2]$ ls
hostkeys/ id_dsa_1024_a id_dsa_1024_a.pub random_seed
[young@local .ssh2]$
.pub는 공개키이고 id_dsa_1024_a 는 개인키(private key)입니다.
local의 identification 파일을 생성할 차례다.
[young@local .ssh2]$ echo "IdKey id_dsa_1024_a" > identification
[young@local .ssh2]$
id_dsa_1024_a.pub 파일을 whoami에서 /home/young/.ssh2/에 Local.pub로 복사한다.
이때 scp를 이용한다. whoami에서 local에 있는 id_dsa_1024.a를
/home/young/.ssh2/Local.pub로 복사하는 과정
▶ scp(secure copy client) 파일 복사
scp는 투명한 ssh인증과 암호화를 통하여 호스트간에 파일을 복사 또는 이
동 하는 기능을 제공합니다. #man scp를 실행하면 아주 자세히 알 수 있지
만 여기서는 간단한 사용법만 언급하도록 하겠습니다.
=> user@host1 : filename user2@host2:filename
다음은 scp의 명령행 옵션을 요약한 것입니다.
- A ; 파일에 대한 파일 통계 출력 기능 해제
- a : 파일에 대한 파일 통계 출력 기능 사용
- cipher : 이번 전송에서 사용할 암호 방법 명시 ( blowfis, idea, 3des)
- i : 신원 파일 변경
- o(ssh옵션) : 파일을 전송하기 전에 ssh에게 옵션을 전달
- P : 원격 호스트로 접속할 포트 명시
- q : 세션에 대한 통게 출력 기능 해제
- Q : 세션에 대한 통계 출력 기능 사용
- r : 디렉토리를 재귀적으로 복사
- v : 디버그 모드로 수행
[young@whoami young]$ scp
211.187.74.28:/home/young/.ssh2/id_dsa_1024_a.pub ./.ssh2/Local.pub
young@211.187.74.28's password:
Transfering
211.187.74.28:/home/young/.ssh2/id_dsa_1024_a.pub
-> ./.ssh2/Local.pub (1k)
|.............................................................................|
735 bytes transferred in 0.09
seconds [7.18 kB/sec].
[young@whoami young]$
authorization 파일을 ~/.ssh2 안데 생성한다.(whoami)
[young@whoami .ssh2]$ echo "key Local.pub" > authorization
[young@whoami .ssh2]$
테스팅
[young@local .ssh2]$ ssh
whoami.sarang.net
Passphrase for key
"/home/young/.ssh2/id_dsa_1024_a" with comment
"1024-bit dsa, young@local, Sun Jan 28 2001 22:28:13
+0900":
Last login: Sun Jan 28 2001
23:13:00 +0900
No mail.
[young@whoami young]$
먼저 공개키의 Passphrase를 물어본다. 이때 아까 위에서 입력한 Passphrase를 입력하면
로그인할수 있다. 이때 공캐키가 맞지 않으면 시스템의 패스워드를 물어본다.
예 )
[young@local .ssh2]$ ssh
whoami.sarang.net
Passphrase for key
"/home/young/.ssh2/id_dsa_1024_a" with comment
"1024-bit dsa, young@local, Sun Jan 28 2001 22:28:13
+0900":
young@whoami.sarang.net's
password:
5) SSH client 사용
일단 가장 기본적이 사용법은 아래와 같다. 일단 보기 쉽게 하기 위하여 remote를 oops라고 하고 local(이때까지 설정을 한 host)를 bbuwoo라고 하겠다.
[bbuwoo@oops oops]$ ssh bbuwoo
Passphrase for key "/home/member/oops/.ssh2/id_dsa_1024_a" with
comment "1024-bit dsa, oops@hera.digitalmax.net,
Mon Sep 20 1999 15:24:57 +0900": PASSWORD PHRASE
Last login: Tue Sep 21 1999 15:38:53 +0900
[bbuwoo@bbuwoo bbuwoo]$
일단 위와 같이 ssh <접속할 hostname>로 접속을 하게 되면 현재 user인 bbuwoo로 login을 하는 것을 알수가 있다. 앞에서와 같이 authorization file에 publickey가 등록이 되어 있는 user라면 위와 같이 passphrase 를 물어 오게 되며 등록이 안되어 있는 경우 bbuwoo account의 password를 물어오게 된다.
[bbuwoo@oops oops]$ ssh 192.168.1.200
Accepting host 192.168.1.200 key without checking.
bbuwoo@192.168.1.200's password: Account Password
Last login: Tue Sep 21 1999 15:38:53 +0900
[bbuwoo@bbuwoo bbuwoo]$
즉 위에서 보면 Accepting host 192.168.1.200 key without checking 이라는 문구에서와 같이 passphrase 를 check하지 않고선 접속을 받아들이겠다는 의미를 뜻한다. 그럼 remote와 local의 username이 다를 경우에는 아래의 option을 사용하여 login을 하면 된다.
[형식 : ssh -l 사용자명 호스명 ]
[oops@oops oops]$ ssh -l bbuwoo oops
Accepting host 192.168.1.200 key without checking.
bbuwoo@192.168.1.200's password: Account Password
Last login: Tue Sep 21 1999 15:38:53 +0900
[bbuwoo@bbuwoo bbuwoo]$
위의 예제는 oops라는 host의 oops라는 user로 host bbuwoo의 bbuwoo라는 user로 ssh login을 하기 위한 예이다. 즉 위처럼 두 host간의 user가 다르다면 -l option을 사용하여 login을 할수가 있는 것이다.
만약 접속이 안되고 에러가 발생할때는 아래의 option을 이용할수도 있다.
[oops@oops oops]$ ssh -v bbuwoo
debug: hostname is 'bbuwoo'.
debug: Unable to open /home/bbuwoo/.ssh2/ssh2_config
debug: connecting to bbuwoo...
debug: entering event loop
debug: ssh_client_wrap: creating transport protocol
debug: ssh_client_wrap: creating userauth protocol
debug: Ssh2Transport/trcommon.c:592/ssh_tr_input_version:
Remote version: SSH-2.0-2.0.13 (non-commercial)
debug: Host key found from the database.
debug: Ssh2Common/sshcommon.c:155/ssh_common_special:
special packet received from connection protocol: 3
debug: Ssh2Common/sshcommon.c:155/ssh_common_special:
special packet received from connection protocol: 4
debug: Ssh2AuthPubKeyClient/authc-pubkey.c:797/
ssh_client_auth_pubkey_agent_list_complete:
adding keyfile "/home/member/oops/.ssh2/id_dsa_1024_a"
to candidates
bbuwoo@bbuwoo's password: Account Password
debug: Ssh2Common/sshcommon.c:155/ssh_common_special:
special packet received from connection protocol: 6
debug: Ssh2/ssh2.c:304/client_authenticated:
client_authenticated
debug: Ssh2Common/sshcommon.c:466/ssh_common_new_channel:
num_channels now 1
debug: DISPLAY not set; X11 forwarding disabled.
Last login: Tue Sep 21 1999 15:44:36 +0900
[bbuwoo@bbuwoo bbuwoo]$
위의 예제는 authorization file이 없기 때문에 passphrase를 checking 하지 않고 account password를 물어 보게 되는 경위를 나타낸다.
또 원격 호스트에 접속을 하지 않고서 원격 호스트의 파일을 가져오는 법을 보겠다.
[bbuwoo@oops oops]$ scp bbuwoo.net:/home/member/oops/a.txt a.txt
Passphrase for key "/home/member/oops/.ssh2/id_dsa_1024_a" with
comment "1024-bit dsa, oops@oops.org
Mon Sep 20 1999 15:24:57 +0900": PASSWORD PHRASE
Transfering bbuwoo.net:/home/member/oops/a.txt -> a.txt (2k)
|...........................................................|
2004 bytes transferred in 0.22 seconds [105.26 kB/sec].
[bbuwoo@bbuwoo bbuwoo]$
윈도우에서 SSH를 이용해 접속하고 싶다면 Tera Term Pro + TTSSH프로그램이나,
SecureCRT, SSH Secure Shell Client를 쓰면 된다..
SSH Secure Shell Client 은 http://www.ssh.com/ 에 접속하여 프로그램을 다운 받을수가 있다. 이곳에서 evaluation version( 30일 제한 ) 과 non - commercial version 이 있는데 evaluation version을 다운 받은 사람은 등록을 하고 licence를 얻어 프로그램이 설치 된 곳에 복사하여 쓰면 되고, 처음 사용자는 등록을하고 non-commercial version을 다운 받아 설치하면 된다..
SSH(Secure Shell)은 네트워크의 다른 컴퓨터에 로그인 할 수 있으며 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 프로그램이다
강력한 인증방법과 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공해 준다.
SSH는 두 호스트간의 통신 암호화와 사용자 인증을 위하여 공개 열쇠 암호 기법을 사용한다. 즉, telnet,rlogin,rcp,ftp,pop등과 비교해 보면 이들은 스니퍼(NetWorek 상에서 패킷을 Capturer 하기 위한 해킹툴)를 당하면 입력 문자 그대로 패킷이 쉽게 노출된다..
이에 반해 ssh는 이 모든 문자들을 암호화 하여 비록 노출이 된다 하더라도 이해할 수 없는 암호화된 문자로 나타나게 되는 것입니다. 또 IP스푸핑, DNS 스푸핑등으로부터 SSH를 사용하면 보호가 가능하다.
세션 하이젝킹(Session Hijacking)과 DNS 스푸핑을 방지해 주면서 원격 호스트에 로그인 하거나 호스트끼리 데이터를 복사하기 위해 사용될 수 있다.
일반 login프로그램들이 packet을 전송할 때 암호화 되지 않은 Test(PlanText)으로 전달 하는과 달리 ssh는 packet자체를 암호화를 하여 보내기 때문에 원격 관리의 보안이 매우 안정적이다.
SSH는 RSA공개키/개인키 방식을 이용하여 암호화 하게 되는데 Secure ID, S/Key, Kerberos and TIS 역시 지원한다.
또한 SSH 는 X11서버와 연결도 지원 하므로 접속한 서버의 X프로그램 또한 실행 가능하게 해줍니다. 그리고 파일 전송등 현재는 sftp까지 지원을 하고 있으며, SOCKS 도 지원한다.
현재는 ssh1과 ssh2가 나와 있는데 ssh1은 공개로 자유롭게 사용가능하지만 ssh2는 비상업적인 경우에만 자유롭게 사용할 수 있는 라이선스 제한을 가하고 있다.
▶ ssh2 license
여기서는 유닉스에서의 라이센스 적용에 대해서 다루고자 한다.
www.ssh.com/products/ssh/ssh_license_agreement.html
위 링크에 라이센스에 대한 구체적인 사항이 나온다.
요약하면 리눅스,FreeBSD,NetBSD,OpenBSD에서 ssh2를 사용하고자 한다면 상용이든 그렇지 않든 관계가 없다. 윈도용은 30일 평가 버전이 존재하며 사용하기 위해서는 라이센스에 따른 비용을 지불하여야 한다. 이글의 라이센스 다른 웹페이지나,ftp등에 이 글을 그대로 기재할수 있다. 그러나 종이나 여타 인쇄매체를 사용할 시에는 이 내용들을 인용만 해야 한다. 즉 참고만 가능하다.
▶ ssh의동작
다음과같은 2쌍의 RSA key를사용하여동작한다.
◎ 클라이언트의개인키와공개키( authentication 에사용 )
user try to authenticate -> sever checks matching public keys ->
send challenge to the user -> user sign the challenge using the private key ->
return signed challenge to the server
◎ host 의개인키와공개키 ( login또는 connect된컴퓨터(host)가실제 connect
하려고했던컴퓨터인지를확인하는데사용)
host's identification changed -> issues warning
-> disable password authentication
1) ssh 설치
OpenSSH는 설치시 OpenSSL(www.openssl.org)이나 SSLeay를 필요로 한다.
여기서는 OpenSSL을 사용하겠다. SSL(Secure Socket Layer)은 암호화관련라이브러리라고 생각하면 되겠다. 나중에(?) https://으로 시작하는 보안걸린 웹페이지를 만들때도 사용된다.
▶ OpenSSL설치
OpenSSH를 설치전 먼저 OpenSSL을 설치해야 한다.
전형적인 유닉스 설치방법인 configure, make, make install만 해주면 끝이다.
ssh 소스파일 http://www.ssh.com에서 받을수 있습니다.
## cd ssh-3.0.1.tar.gz
# ./configure (configuration)
# make
# make install (루트계정으로 이 명령을 실행해야 한다)
ssh2(ssh-3.0.1.tar.gz)를설치하게되면다음과같은디렉토리에
프로그램이생성된다.
▶ /usr/local/sbin
sshd2 : server demon 프로그램
▶ /usr/local/bin
ssh2 : ssh의클라이언트프로그램
ssh-keygen2 : 키생성유틸리티
ssh-agent2 : authentication 에이전트
ssh-add2 : authentication 에이전트에 identities 추가한다
sftp : secure ftp
sftp-server : sftp server(sshd2에의해실행된다)
scp2 : secure rcp
▶ /etc/ssh2
hostkey : host의비밀키 개인 키이며 보안에 조심해야 하는 파일
hostkey.pub : host의공개키
ssh2_config : ssh 클라이언트의 설정파일로 실제로 ssh1과 호환할 필요
가 없으면 신경쓰지 않아도 된다.
sshd2 _config : ssh demon의 설정 파일입니다.
▶ ~/.ssh2
id_dsa_1024_a : 1024 비트비밀키
id-dsa-1024_a.pub : 공개키
authorization : server측에생성 (클라이언트의공개키파일에대한정보)
identification : 클라이언트측에생성 ( 클라이언트의개인키파일에대한정보)
random_seed
manager:/etc/ssh2 % ls
./ hostkey.pub ssh_dummy_shell.out
../ random_seed sshd2_9999.pid
hostkey ssh2_config sshd2_config
▶/home/SHELL/.ssh2/hostkeys
key_22_210.100.93.42.pub (클라이언트(IP address 210.100.254.13) 측의호스트 공개키즉 user 측컴퓨터의 /etc/ssh2/host.pub의값, 클라이언트가처음 server 에 login할때 server측에전달된다. ) 각 file들을 설명하자면 hostkey는 말그대로 host를 나타내는 privite key이며 보안에 아주 신경을 써야 하는 파일이다. hostkey.pub는 말그대로 host를 나타내는 공개 key입니다. ssh2_config는 ssh client의 설정 file이며, 실제로 ssh1과의 호환을 고려하지 않는다면 손을 델 필요가 없습니다. sshd2_config는 ssh daemon의 설정 파일이면, 한가지의 설정만 빼고는 ssh1과의 호환을 고려하지 않느다면 특별히 ssh2_config역시 손을 볼 것은 없다고 생각된다
2) ssh 서버 설정하기
manager:/etc/ssh2 % vi sshd2_config
## SSH CONFIGURATION FILE FORMAT VERSION 1.1
## REGEX-SYNTAX egrep
## end of metaconfig
## (leave above lines intact!)
## sshd2_config
## SSH 3.0 Server Configuration File
##
## 공통설정
# VerboseMode no
# QuietMode yes
# ForcePTTYAllocation no
# SyslogFacility AUTH
# SyslogFacility LOCAL7
## SSH1 compatibility (ssh1 호환성)
# Ssh1Compatibility
# Sshd1Path
==> 위의 두line은 ssh1과의 호환 부분이다. 여기서는
생략한다. SSH1 로의 접속이 요구 된다면 openssh 를 사용하는
것을 권장한다. openssh 는 동시에 ssh1, ssh2 를 지원한다
# This is given as argument to sshd1 with "-f" if sshd2 is invoked
# with "-f"
# Sshd1ConfigFile /etc/sshd_config_alternate
## Chrooted environment
# ChRootUsers ftp,guest
# ChRootGroups guest
sftp 를 이용하여 작업을 할 경우 지정된 유저는 자신의 홈계정
이상으로 올라가지 못한다. Chroot환경을 사용하는 방법은 뒤에
서 따로 다루도록 하겠다.
## subsystem definitions
# Subsystem's don't have defaults, so this is needed here (uncommented).
subsystem-sftp sftp-server
# Network 설정
# Port is not commented out, as it is needed by the example startup
# scripts. Well, the default won't likely change.
Port 22
=> ssh가 사용할 port를 지정해 준다. 변경 필요성은 별로 없다.
# ListenAddress 0.0.0.0
=> sshd가 귀를 기울일 주소를 정해준다. 0.0.0.0은 모든 곳으로
부터 접속을 받아들이겠다는 의미이다. 하지만 패키징을 할때
어떻게 한것인지는 모르겠지만 tcp-wrapper의 영향을 받아서
hosts.deny에서 막혀 있으면 접속이 안되니 hosts.allow와
hosts.deny에서 sshd2 항목으로 제어를 할수가 있다.
# RequireReverseMapping no
=> 접속하는 곳의 도메인이 Revers Mapping이 되는지를 확인하여 접속을
허가할지 안할지를 지정한다. 실제로 internet상에 호스트들중
revers mapping이 안되는 host가 상당히 많으며 또한 여러분이 사용하는
host중에도 revers mapping 이 안되는 host이 대다수이니 no로
설정을 하는 것이 낳을듯 하다. 자신의 host들이 revers mapping이 되는
것이 확실하다면 보안상 yes로 하는 것이 좋을수도 있다.
단 revers mapping이 안되면 접속이 안된다는 것을 명심하자
# MaxBroadcastsPerSecond 0
# MaxBroadcastsPerSecond 1
# NoDelay yes
# KeepAlive yes
# MaxConnections 50
# MaxConnections 0
=> 최대 몇개의 접속을 허락할지를 지정합니다. 0은 제한을 하지 않는다는 것
을 의미합니다.
# 0 == number of connections not limited
## Crypto
# Ciphers AnyCipher
# Following includes "none" 'cipher':
# Ciphers AnyStd
## Ciphers AnyStdCipher
# Ciphers 3des
=> 세션을 암호화 할 때 사용할 방법을 명시해 줍니다
(idea,des,3des,blowfish,arcfour 또는 없음)
# Following includes "none" 'mac':
# MACs AnyMAC
#
# MACs AnyStd
# MACs AnyStdMAC
# RekeyIntervalSeconds 3600
## User(사용자 설정)
# PrintMotd yes
==> login 을 한 후에 /etc/motd file 을 출력 할 것인지의 여무를 지정한다
# CheckMail yes
==> login 을 한 후에 SHELL 상에서 메일 도착 여부 체크 설정을 지정한다.
# UserConfigDirectory "%D/.ssh2"
==> user들의 정보가 들어 있는 directory를 지정한다.
# UserConfigDirectory "/etc/ssh2/auth/%U"
# UserKnownHosts yes
# LoginGraceTime 600
# PermitEmptyPasswords no
# StrictModes yes
# IdleTimeOut 1h
## User public key authentication
# HostKeyFile hostkey
# PublicHostKeyFile hostkey.pub
# RandomSeedFile random_seed
# IdentityFile identification
# AuthorizationFile authorizaj\tion
# AllowAgentForwarding yes
## Tunneling
# AllowX11Forwarding yes
# AllowTcpForwarding yes
# AllowTcpForwardingForUsers sjl, cowboyneal@slashdot\.org
#
# DenyTcpForwardingForUsers 2[[:isdigit:]]*4,peelo
# AllowTcpForwardingForGroups priviliged_tcp_forwarders
# DenyTcpForwardingForGroups coming_from_outside
## Authentication
## Hostbased and PAM are not enabled by default.
# BannerMessageFile /etc/ssh2/ssh_banner_message
# BannerMessageFile /etc/issue.net
# PasswordGuesses 3
==> 인증에 실패했을때 몇번까지 재시도할수 있는지를 지정한다.
# AllowedAuthentications hostbased,publickey,password
# AllowedAuthentications publickey,pam-1@ssh.com
# AllowedAuthentications publickey,password
==> 인증 순서를 지정한다.
# RequiredAuthentications publickey,password
==> 공개키를 이용하여 인증을 하려면 위설정의 주석을 풀어준다.
# HostbasedAuthForceClientHostnameDNSMatch no
# SshPAMClientPath ssh-pam-client
## Host restrictions
# AllowHosts localhost, foobar.com, friendly.org
#
## Next one matches with, for example, taulu.foobar.com, tuoli.com, but
## not tuoli1.com. Note that you have to input string "\." when you want it
## to match only a literal dot. You also have to escape "," when you
## want to use it in the pattern, because otherwise it is considered a list
## separator.
## AllowHosts => Ssh 서비스에 접근가능한호스트 명시 (예 : AllowHosts
shell.ourcompany.net) 호스트는 IP를 스거나 호스트명을 쓸 수 있으며 와일드카드가 지원되고 공백문자로 호스트를 구분합니다.
## AllowHosts t..l.\..*
## The following matches any numerical IP-address (yes, it is cumbersome)
##
## AllowHosts ([[:digit:]]{1\,3}\.){3}[[:digit:]]{1\,3}
# Same thing is achieved with using the special prefix "\i" in a
## pattern. This means that the pattern is only used to match
## IP-addresses.
##
## Using the above example:
##
## AllowHosts \i.*
##
## You can probably see the difference between the two.
##
# DenyHosts evil\.org, aol\.com
DenyHosts : 명시된 호스트는 ssh서비스에 접근할 수 없도록 하는 기능(Deny Hosts
shell.ourcompany.net).호스트 IP를 쓰거나 호스트 명을 쓸 수 있으며 와일드 카드가
지원되고 공백 문자로 호스트를 구분합니다.
# AllowSHosts trusted\.host\.org
AllowSHosts : .shosts나 .rhosts에 있는 호스트들 중에서 shd서비스를 접근할 수 있는 호스트를 명시. 호스트는 IP 를 스거나 호스트명을 쓸 수 있으며 와일드카드가 지원되고 공백 문자로 호스트를 구분합니다.
# DenySHosts not\.quite\.trusted\.org
# IgnoreRhosts no
# IgnoreRootRHosts no
## 위의 설정이 되어 있지 않으면 기본값으로 IgnorRhosts 값을 가진다.
## 유저 제한
# AllowUsers sj.*,s[[:isdigit:]]*,s(jl|amza)
# DenyUsers skuuppa,warezdude,31373
# DenyUsers don@untrusted\.org
# AllowGroups staff,users
AllowGroups : ssh 로그인을 해당 그룹으로 제한한다. 각각의 그룹명은 공백으로 구분한다. 와일드 카드(* 와 ?)를 사용할수 있다.
# DenyGroups guest
DenyGroups : AllowGroups의 반대 역할을 한다. 지정된 그룹은 로그인이 거부된다.
# PermitRootLogin nopwd
# PermitRootLogin yes
==> root로의 login 허락 여부를 지정한다.
3) 사용자 개인 설정
------------------------------
1. 비밀번호에 의한 인증/접속
------------------------------
manager /export/home/opsign 8 % ssh remote.host 또는
manager /export/home/opsign 8 % ssh remote.host -l username
타겟서버에 비밀번호를 입력하고 접속한다.
접속했던 호스트 정보는 ~/.ssh/known_hosts 에 남는다.
** 비밀번호에 의한 인증 접속만 이용한다면 아래부분의 RSA 키값을 만들 필요가 없다
------------------------------------
2. 암호문구(passphrase)에 의한 접속
------------------------------------
암호문구에 의한 접속은 비밀번호 대신에 암호문구를 사용하며, 암호없이 로그인할 수도
있다.
manager /export/home/opsign 8 % ssh-keygen
로컬서버의 공개키를 만든다.
RSA키를 만들면서 암호문구를 입력하면 ~/.ssh 폴더에 1024비트의 개인키(identity)와 공개키(identity.pub)가 만들어 진다. 암호문구는 ssh 접속할 때 비밀번호 대신 사용한다.
4) 하고자 하는 작업예 )
local 컴퓨터에서 whoami 컴퓨터의 young이란 유저가 시스템의 패스워드를 사용하지 않고
local young user의 공개키 (Public key) 를 사용하여 접근한다.
local 에서 공개키와 개인키를 생성한다.
[young@local .ssh2]$ ssh-keygen2
Generating 1024-bit dsa key pair
10 Oo.oOo..oOo.
Key generated.
1024-bit dsa, young@local, Sun
Jan 28 2001 22:28:13 +0900
Passphrase :
Again :
Private key saved to
/home/young/.ssh2/id_dsa_1024_a
Public key saved to
/home/young/.ssh2/id_dsa_1024_a.pub
[young@local .ssh2]$
Passphrase: ->이곳에 패스워드를 입력한다.
Again : -> 다시 입력확인..
생성된 파일들..
[young@local .ssh2]$ ls
hostkeys/ id_dsa_1024_a id_dsa_1024_a.pub random_seed
[young@local .ssh2]$
.pub는 공개키이고 id_dsa_1024_a 는 개인키(private key)입니다.
local의 identification 파일을 생성할 차례다.
[young@local .ssh2]$ echo "IdKey id_dsa_1024_a" > identification
[young@local .ssh2]$
id_dsa_1024_a.pub 파일을 whoami에서 /home/young/.ssh2/에 Local.pub로 복사한다.
이때 scp를 이용한다. whoami에서 local에 있는 id_dsa_1024.a를
/home/young/.ssh2/Local.pub로 복사하는 과정
▶ scp(secure copy client) 파일 복사
scp는 투명한 ssh인증과 암호화를 통하여 호스트간에 파일을 복사 또는 이
동 하는 기능을 제공합니다. #man scp를 실행하면 아주 자세히 알 수 있지
만 여기서는 간단한 사용법만 언급하도록 하겠습니다.
=> user@host1 : filename user2@host2:filename
다음은 scp의 명령행 옵션을 요약한 것입니다.
- A ; 파일에 대한 파일 통계 출력 기능 해제
- a : 파일에 대한 파일 통계 출력 기능 사용
- cipher : 이번 전송에서 사용할 암호 방법 명시 ( blowfis, idea, 3des)
- i : 신원 파일 변경
- o(ssh옵션) : 파일을 전송하기 전에 ssh에게 옵션을 전달
- P : 원격 호스트로 접속할 포트 명시
- q : 세션에 대한 통게 출력 기능 해제
- Q : 세션에 대한 통계 출력 기능 사용
- r : 디렉토리를 재귀적으로 복사
- v : 디버그 모드로 수행
[young@whoami young]$ scp
211.187.74.28:/home/young/.ssh2/id_dsa_1024_a.pub ./.ssh2/Local.pub
young@211.187.74.28's password:
Transfering
211.187.74.28:/home/young/.ssh2/id_dsa_1024_a.pub
-> ./.ssh2/Local.pub (1k)
|.............................................................................|
735 bytes transferred in 0.09
seconds [7.18 kB/sec].
[young@whoami young]$
authorization 파일을 ~/.ssh2 안데 생성한다.(whoami)
[young@whoami .ssh2]$ echo "key Local.pub" > authorization
[young@whoami .ssh2]$
테스팅
[young@local .ssh2]$ ssh
whoami.sarang.net
Passphrase for key
"/home/young/.ssh2/id_dsa_1024_a" with comment
"1024-bit dsa, young@local, Sun Jan 28 2001 22:28:13
+0900":
Last login: Sun Jan 28 2001
23:13:00 +0900
No mail.
[young@whoami young]$
먼저 공개키의 Passphrase를 물어본다. 이때 아까 위에서 입력한 Passphrase를 입력하면
로그인할수 있다. 이때 공캐키가 맞지 않으면 시스템의 패스워드를 물어본다.
예 )
[young@local .ssh2]$ ssh
whoami.sarang.net
Passphrase for key
"/home/young/.ssh2/id_dsa_1024_a" with comment
"1024-bit dsa, young@local, Sun Jan 28 2001 22:28:13
+0900":
young@whoami.sarang.net's
password:
5) SSH client 사용
일단 가장 기본적이 사용법은 아래와 같다. 일단 보기 쉽게 하기 위하여 remote를 oops라고 하고 local(이때까지 설정을 한 host)를 bbuwoo라고 하겠다.
[bbuwoo@oops oops]$ ssh bbuwoo
Passphrase for key "/home/member/oops/.ssh2/id_dsa_1024_a" with
comment "1024-bit dsa, oops@hera.digitalmax.net,
Mon Sep 20 1999 15:24:57 +0900": PASSWORD PHRASE
Last login: Tue Sep 21 1999 15:38:53 +0900
[bbuwoo@bbuwoo bbuwoo]$
일단 위와 같이 ssh <접속할 hostname>로 접속을 하게 되면 현재 user인 bbuwoo로 login을 하는 것을 알수가 있다. 앞에서와 같이 authorization file에 publickey가 등록이 되어 있는 user라면 위와 같이 passphrase 를 물어 오게 되며 등록이 안되어 있는 경우 bbuwoo account의 password를 물어오게 된다.
[bbuwoo@oops oops]$ ssh 192.168.1.200
Accepting host 192.168.1.200 key without checking.
bbuwoo@192.168.1.200's password: Account Password
Last login: Tue Sep 21 1999 15:38:53 +0900
[bbuwoo@bbuwoo bbuwoo]$
즉 위에서 보면 Accepting host 192.168.1.200 key without checking 이라는 문구에서와 같이 passphrase 를 check하지 않고선 접속을 받아들이겠다는 의미를 뜻한다. 그럼 remote와 local의 username이 다를 경우에는 아래의 option을 사용하여 login을 하면 된다.
[형식 : ssh -l 사용자명 호스명 ]
[oops@oops oops]$ ssh -l bbuwoo oops
Accepting host 192.168.1.200 key without checking.
bbuwoo@192.168.1.200's password: Account Password
Last login: Tue Sep 21 1999 15:38:53 +0900
[bbuwoo@bbuwoo bbuwoo]$
위의 예제는 oops라는 host의 oops라는 user로 host bbuwoo의 bbuwoo라는 user로 ssh login을 하기 위한 예이다. 즉 위처럼 두 host간의 user가 다르다면 -l option을 사용하여 login을 할수가 있는 것이다.
만약 접속이 안되고 에러가 발생할때는 아래의 option을 이용할수도 있다.
[oops@oops oops]$ ssh -v bbuwoo
debug: hostname is 'bbuwoo'.
debug: Unable to open /home/bbuwoo/.ssh2/ssh2_config
debug: connecting to bbuwoo...
debug: entering event loop
debug: ssh_client_wrap: creating transport protocol
debug: ssh_client_wrap: creating userauth protocol
debug: Ssh2Transport/trcommon.c:592/ssh_tr_input_version:
Remote version: SSH-2.0-2.0.13 (non-commercial)
debug: Host key found from the database.
debug: Ssh2Common/sshcommon.c:155/ssh_common_special:
special packet received from connection protocol: 3
debug: Ssh2Common/sshcommon.c:155/ssh_common_special:
special packet received from connection protocol: 4
debug: Ssh2AuthPubKeyClient/authc-pubkey.c:797/
ssh_client_auth_pubkey_agent_list_complete:
adding keyfile "/home/member/oops/.ssh2/id_dsa_1024_a"
to candidates
bbuwoo@bbuwoo's password: Account Password
debug: Ssh2Common/sshcommon.c:155/ssh_common_special:
special packet received from connection protocol: 6
debug: Ssh2/ssh2.c:304/client_authenticated:
client_authenticated
debug: Ssh2Common/sshcommon.c:466/ssh_common_new_channel:
num_channels now 1
debug: DISPLAY not set; X11 forwarding disabled.
Last login: Tue Sep 21 1999 15:44:36 +0900
[bbuwoo@bbuwoo bbuwoo]$
위의 예제는 authorization file이 없기 때문에 passphrase를 checking 하지 않고 account password를 물어 보게 되는 경위를 나타낸다.
또 원격 호스트에 접속을 하지 않고서 원격 호스트의 파일을 가져오는 법을 보겠다.
[bbuwoo@oops oops]$ scp bbuwoo.net:/home/member/oops/a.txt a.txt
Passphrase for key "/home/member/oops/.ssh2/id_dsa_1024_a" with
comment "1024-bit dsa, oops@oops.org
Mon Sep 20 1999 15:24:57 +0900": PASSWORD PHRASE
Transfering bbuwoo.net:/home/member/oops/a.txt -> a.txt (2k)
|...........................................................|
2004 bytes transferred in 0.22 seconds [105.26 kB/sec].
[bbuwoo@bbuwoo bbuwoo]$
윈도우에서 SSH를 이용해 접속하고 싶다면 Tera Term Pro + TTSSH프로그램이나,
SecureCRT, SSH Secure Shell Client를 쓰면 된다..
SSH Secure Shell Client 은 http://www.ssh.com/ 에 접속하여 프로그램을 다운 받을수가 있다. 이곳에서 evaluation version( 30일 제한 ) 과 non - commercial version 이 있는데 evaluation version을 다운 받은 사람은 등록을 하고 licence를 얻어 프로그램이 설치 된 곳에 복사하여 쓰면 되고, 처음 사용자는 등록을하고 non-commercial version을 다운 받아 설치하면 된다..