System/OS
2013.04.23 16:03
[linux] SSH에 대한 기본 설명과 설치/설정
조회 수 10930 댓글 0
SSH(Secure Shell)은 네트워크의 다른 컴퓨터에 로그인 할 수 있으며 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도 록 해주는 프로그램입니다.
강력한 인증방법과 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있 는 기능을 제공해 줍니다.
SSH는 두 호스트간의 통신 암호화와 사용자 인증을 위하여 공개 열쇠 암호 기법을 사용합니다.
즉, telnet, rlogin, rcp등과 비교해 보면 이들은 스니퍼를 당하면 입력 문자 그대로 패킷이 쉽게 노출됩니다.
이에 반해 ssh는 이 모든 문자들을 암호화 하여 비록 노출이 된다 하더라도 이해할 수 없는 암호화된 문자로 나타나게 되는 것입니다. 또 IP스푸핑, DNS 스푸핑등으로부터 SSH를 사용하면 보호가 가능합니다.
세션 하이젝킹(Session Hijacking)과 DNS 스푸핑을 방지해 주면서 원격 호스트에 로그인 하거나 호스트끼리 데이터를 복사하기 위해 사용될 수 있습니다.
일반 login프로그램과 달리 패킷 전송시 암호화하기 때문에 원격 관리의 보안이 매우 안정적입니다.
SSH는 RSA공개키/개인키 방식을 이용하여 암호화 하게 되는데 Secure ID, S/Key, Kerberos and TIS 역시 지원합니다.
또한 SSH 는 X11서버와 연결도 지원 하므로 접속한 서버의 X프로그램 또한 실행 가능하게 해줍니다.
그리고 파일 전송등 현재는 sftp까지 지원을 하고 있으며, SOCKS 도 지원합니다.
현재는 ssh1과 ssh2가 나와 있는데 ssh1은 공개로 자유롭게 사용 가능하지만, ssh2는 비상업적인 경우에만 자유롭게 사용할 수 있는 라이선스 제한을 가하고 있습니다.
[1] SSH설치
ssh의 소스파일은 http//www.ssh.org에서 받을 수 있습니다.
그러면 우선 소스파일의 압축을 풀어보도록 하겠습니다.
# tar zxvf ssh-2.0.13.tar.gz # cd ssh-2.0.13 # ./configure
configure는 시스템 종류와 ssh를 컴파일 하는데 필요한 파일들을 확인하는 작업을 수행하게 되는데 에러없이 정상적으로 종료가 되면 아래와 같이 ssh를 컴파일합니다.
# make
시스템 속도에 따라서 컴파일 하는데 걸리는 시간은 약간의 차이가 있을 것입니다.
컴파일하는 동안 에러가 출력되는지 확인합니다.
컴파일이 끝나면 ssh디렉토리에는 다음과 같은 실행파일이 만들어졌을 겁니다.
scp2
ssh2
ssh-add2
ssh-agent2
sshd2
ssh-keygen2
위의 파일들이 제대로 생성되었는지 확인하기 위해서 다음과 같이 실행해보겠습니다.
File * | grep utable
확인이 끝났으면 이제 컴파일된 파일을 설치합니다.
# make install
이 명령은 호스트키를 포함한ssh 의 모든 유틸리티를 /usr/local 디렉토리에 복사하고 ssh도움말 문서를 작성해 줍니다.
만약 이전 파일이 이미 존재할 경우 *.old 파일명으로 이전 파일을 저장합니다.
이들 모두를 삭제하고자 한다면 다음과 같이 실행하시면 됩니다.
# cd apps/ssh # make clean-up-old
그러면 모두 삭제가 됩니다.
마지막으로 셋업을 하기 위해 아래 명령을 실행시켜 주면 모든 설치가 끝납니다.
# configure sshd2
[2] SSH 설정하기
설치가 모두 끝나면 /etc/ssh2 디렉토리하에 다음과 같은 파일들이 생성됩니다.
hostkey : host 의 비밀키로 개인 키이며 보안에 조심해야 하는 파일
hostkey.pub : host를 나타내는 공개키
ssh2_config : ssh 클라이언트의 설정파일로 실제로 ssh1과 호환할 필요가 없으면 신경쓰지 않아도 된다.
sshd2_config: ssh demon의 설정 파일입니다.
그외 각 계정의 키는 홈디렉토리하에 .ssh2 라는 디렉토리에 생성되는데 공개키는 .pub 라는 확장자가 붙고 비밀키는 확장자가 붙지 않습니다.
그러면 이제 ssh 설정 파일의 옵션을 필요에 따라 바꾸거나 확인해 주어야 합니다.
ssh2_config는 ssh client의 설정 file로 만약 사용자가 sh1과의 호환하여 사용하지 않을 것이라면 별로 수정 설정해야 할 것은 없습니다.
다음은 ssh 서버설정 파일인 sshd2_config의 명령행 옵션들입니다.
AllowGroups
ssh서비스에 접근 가능한 그룹명시(예 : AllowGroups sysadmin accounting)
와일드카드가 지원되며 공백문자로 그룹을 구분합니다.
AllowHosts
Ssh 서비스에 접근가능한호스트 명시(예 : AllowHosts shell.ourcompany.net)
호스트는 IP를 스거나 호스트명을 쓸 수 있으며 와일드카드가 지원되고 공백문자로 호스트를 구분합니다.
AllowSHosts
.shosts나 .rhosts에 있는 호스트들 중에서 shd서비스를 접근할 수 있는 호스트를 명시.
호스트는 IP 를 스거나 호스트명을 쓸 수 있으며 와일드카드가 지원되고 공백 문자로 호스트를 구분합니다.
CheckMail (yes/no)
사용자가 로그인할 때 새매일이 도착했음을 알리도록 하는 기능을 설정하며 기본값은 yes로 되어있습니다. Port 22 : ssh가 사용할 port를 지정해 줍니다. 변경의 필요성은 별로 없습니다.
Cipher (ciher)
세션을 암호화 할 때 사용할 방법을 명시해 줍니다.
(idea,des,3des,blowfish,arcfour 또는 없음)
DenyGroups
명시된 그룹은 ssh서비스에 접근할 수 없도록 하는 기능(DenyGroups sysadmin accounting)
와일드카드가 지원되며 공백 문자로 그룹을 구분합니다.
DenyHosts
명시된 호스트는 ssh서비스에 접근할 수 없도록 하는 기능(Deny Hosts shell.ourcompany.net).
호스트 IP를 쓰거나 호스트 명을 쓸 수 있으며 와일드 카드가 지원되고 공백 문자로 호스트를 구분합니다.
ForwardAgent
인증 대리인이 포워드되어야 하는지를 명시
KeepAlive yes
RequireReverseMapping no
클라이언트에게 aliive메시지를 보낼 것인지 명시하는데 접속하는 곳의 도메인이 revers Mapping 이 되는지를 활인하여 접속을 허가할지 안할지를 지정합니다.
실제로 internet상에 호스트 들중 revers mapping 이 안되는 호스트가 상당수이므로 되도록 no로 설정할 것을 권장합니다.
만약 여러분이 사용하시는 host가 revers mapping 이 확실히 된다면 보안상 yes로 하는것이 좋겠지만 revers mapping이 되지 않으면 접속이 불가능 하므로 조심하십시오.
ListenAddress 0.0.0.0
sshd가 귀를 기울일 주소를 정해준다. 0.0.0.0은 모든 곳으로 부터 접속을 받아들이겠다는 의미입니다.
하지만 패키징을 할때 어떻게 한것인지는 모르겠지만 tcp-wrapper의 영향을 받아서 hosts.deny에서 막혀 있으면 접속이 안되니 hosts.allow와 hosts.deny에서 sshd2 항목으로 제어를 할수가 있습니다.
PasswordAuthentication (yes/no)
패스워드 기반의인증방법을 사용할 것인지를 명시
MaxConnections 0
최대 몇개의 접속을 허락할지를 지정합니다. 0은 제한을 하지 않는다는 것을 의미합니다.
PermitRootLogin
ssh를 이용하여 루트로 로그인 할 수 있는지를 명시
PubkeyAuthentication (yes/no)
인증 순서를 지정합니다.
SSH 사용
그럼 이제 ssh 클라이언트 프로그램을 사용하여 서버에 접속해보겠습니다.
주의할 것은 ssh2는 ssh2사이에서만 통신이 가능하고,
만약 ssh1과 호환하려면 설정파일에서 별도로 ssh1 부분 설정을 해주어야 합니다.
ssh1과 통신을 하려면 ssh1과ssh2이 둘 다 설치되어 있어야 합니다.
ssh1과의 호환은 아래에서 언급하도록 하겠습니다.
일단 #sshd host를 실행하여 접속합니다.
host 이름으로 로그인이 될 것입니다.
그러면 다시 호스트 명과 IP주소를 다음과 같이 인자로 전달합니다.
#ssh 210.127.236.93
이때 이미 앞에서 함께 실행했듯이 authorization file 에 공개키가 등록되어 있는 사용자는 passphrase를 묻고, 만약 등록이 안되어 있다면 host account 의 password를 묻습니다.
즉, Accepting host 210.127.236.93 key without checking 이라는 글이 뜨면 passphrase 를 확인하지 않고도 접속이 수용된다는 것이지요.
다음은 ssh 클라이언트의 클라이언트의 명령행 옵션들입니다.
-v : 디버깅모드로 접속이 안되고 에러가 발생할 때 사용
-a : 대리인 인증 포워딩 사용
-c cipher : 현재 세션에서 사용할 암호 방법 명시 ( blowfish, idea, 3des)
-e char : escape 문자 변경
-f : 세션 인증이 끝난 후에 백그라운드로 작업을 수행하도록 명시
-i 파일 : 신원파일을 변경
-l : 로그인시 사용자 명시
-n : /dev/null로 부터 입력을 받는다.
-p port : ssh가 접속하기 위해 사용할 포트 명시
-q : 정적 모드에서는 STDOUT로 경고메시지가 출력되지 않음
-t : 하나의 명령을 수행하더라도 tty를 연다.
-x : x11포워딩 기능 해제
SSH1 과 SSH2 의 호환
Ssh1과 ssh2를 호환 하려면 ssh1과ssh2이 둘 다 설치되어 있어야 합니다.
먼저 서버의 경우 ssh1과의 호환을 유지 하기 위해 /etc/sh2 디렉토리 아래에 sshd2_config 파일을수정해야 하는데 거의 대부분 지원이 디폴트를 사용하면 가능합니다.
Ssh1은 Ssh1Compatibility 와 SshdPath 를 다음과 같이 지정해 주면 됩니다.
Ssh1Compatibility yes
Sshd1Path /경로/sshd1
(경로는 sshd1파일이 존재하는 경로를 말합니다)
ssh2_config도 다음과 같이 수정합니다.
Ssh1Compatibility yes
Sshd1Path/경로/ssh1
(여기서의 경로도 ssh1이 존재하는 경로를 말합니다)
SSH client 사용
일단 ssh2의 설치를 마치고 나면 /etc/ssh2 라는 directory에 아래와 같이 hostkey와 ssh client config file, ssh daemon config file이 설치가 됩니다.
Hanterm - /etc/ssh2
[root@linuxi ssh2]$ ls /etc/ssh2
hostkey hostkey.pub ssh2_config sshd2_config
[root@linuxi ssh2]$
각 file들을 설명하자면 hostkey는 말그대로 host를 나타내는 privite key 이며 보안에 아주 신경을 써야 하는 파일이다.
hostkey.pub는 말그대로 host를 나타내는 공개 key입니다.
ssh2_config는 ssh client의 설정 file이며, 실제로 ssh1과의 호환을 고려하지 않는다면 손을 델 필요가 없다.
sshd2_config는 ssh daemon의 설정 파일이며, 아래를 보도록 하자.
한가지 설정만 빼고는 ssh1과의 호환을 고려하지 않는다면 특별히 sshd2_config 역시 손을 볼것은 없다고 생각됩니다..
Hanterm - /etc/ssh2
[root@linuxi ssh2]$ cat /etc/ssh2/sshd2_config
# sshd2_config
# SSH 2.0 Server Configuration File
*:
Port 22
ssh가 사용할 port를 지정해 준다.
변경 필요성은 별로 없습니다.
ListenAddress 0.0.0.0
sshd가 귀를 기울일 주소를 정해준다.
0.0.0.0은 모든 곳으로 부터 접속을 받아들이겠다는 의미입니다.
하지만 패키징을 할때 어떻게 한것인지는 모르겠지만 tcp-wrapper의 영향을 받아서 hosts.deny에서 막혀 있으면 접속이 안되니 hosts.allow와 hosts.deny에서 sshd2 항목으로 제어를 할수가 있습니다.
28
Ciphers AnyStd
# Ciphers AnyCipher
# Ciphers AnyStdCipher
# Ciphers 3des
IdentityFile identification
AuthorizationFile authorization
HostKeyFile hostkey
PublicHostKeyFile hostkey.pub
RandomSeedFile random_seed
ForwardAgent yes2
ForwardX11 yes
2# DEPRECATED PasswordAuthentication yes
PasswordGuesses 3
인증에 실패했을때 몇번까지 재시도할수 있는지를 지정해야 합니다.
2
# MaxConnections 50
# 0 == number of connections not limited
MaxConnections 0
최대 몇개의 접속을 허락할지를 지정해야 합니다.
0은 제한을 하지 않는다는 것을 의미합니다.
# PermitRootLogin nopwd
PermitRootLogin yes
root로의 login 허락 여부를 지정합니다.
# DEPRECATED PubkeyAuthentication yes
# AllowedAuthentications publickey,password,hostbased
AllowedAuthentications publickey,password
인증 순서를 지정합니다.
# RequiredAuthentications publickey,password
ForcePTTYAllocation no
VerboseMode no
PrintMotd yes
CheckMail yes
UserConfigDirectory "%D/.ssh2"
user들의 정보가 들어 있는 directory를 지정합니다.
# UserConfigDirectory "/etc/ssh2/auth/%U"
SyslogFacility AUTH
# SyslogFacility LOCAL7
Ssh1Compatibility yes
# Sshd1Path
위의 두line은 ssh1과의 호환 부분이다.
여기서는 생략합니다.
# AllowHosts localhost, foobar.com, friend.org
# DenyHosts evil.org, aol.com
# AllowSHosts trusted.host.org
# DenySHosts not.quite.trusted.org
# NoDelay yes
# KeepAlive yes
RequireReverseMapping no
접속하는 곳의 도메인이 Revers Mapping이 되는지를 확인하여 접속을 허가할지 안할지를 지정해야 합니다.
실제로 internet 상에 호스트들중 revers mapping이 안되는 host가 상당히 많으며 또한 여러분이 사용하는 host중에도 revers mapping 이 안되는 host이 대다수이니 no로 설정을 하는 것이 낳6을듯 합니다.
자신의 host들이 revers mapping이 되는 것이 확실하다면 보안상 yes로 하는 것이 좋을수도 있습니다.
단 revers mapping이 안되면 접속이 안된다는 것을 명심하셔야 할 것입니다.
UserKnownHosts yes
# subsystem definitions
subsystem-sftp sftp-server
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
577 | Develop | [php] gd 프로그램.. htm 파일.. ㅋㅋ | hooni | 2013.04.23 | 7562 |
576 | Etc | 정보시스템(정보보안)의 위험관리 설명 | hooni | 2013.04.23 | 19741 |
575 | Etc | 양성/음성 오류에 대한 개념 | hooni | 2013.04.23 | 20236 |
574 | Develop | [js] 비만 지수 측정(BMI) ㅎㅎ | hooni | 2013.04.23 | 7703 |
573 | Develop | [c] 서비스 거부 공격(DoS;Denial of Service) 간단 소스.. ㅋㅋ | hooni | 2013.04.23 | 6804 |
572 | Develop | [c++] 자료구조(링크리스트,스택,큐)와 후위 표기 계산기 샘플 ㅋㅋ 4 | hooni | 2013.04.23 | 12415 |
571 | Develop | [js] 큐 형식으로 배열사용.. ㅋㅋ | hooni | 2013.04.23 | 7111 |
570 | Develop | [js] 자바스크립트와 정규표현식 메뉴얼 (chm 형식) | hooni | 2013.04.23 | 7719 |
569 | Develop | [c++] mfc로 만든 사용자 계정 리스트 출력(EnumUser) 프로그램 예제 | hooni | 2013.04.23 | 7403 |
» | System/OS | [linux] SSH에 대한 기본 설명과 설치/설정 | hooni | 2013.04.23 | 10930 |
567 | Develop | [js] 자바스크립트 메뉴얼 사이트.. ㅋㅋ | hooni | 2013.04.23 | 7481 |
566 | Develop | [js] ajax를 이용해 외부문서 불러오기.. | hooni | 2013.04.23 | 6879 |