ssh 접속시 느린 현상이 간혹 발생한다.


접속이 느린 지점 확인

# ssh -v server

-v 옵션을 줘서 어느 부분에서 접속이 느린지 확인한다


방법1) DNS resolving 문제

서버측의 /etc/ssh/sshd_config 에서

UseDNS no

로 해준다.


방법2) GSSAPIAuthentication  인증 문제

ssh -v 로 확인해본다.

debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Unspecified GSS failure.  Minor code may provide more information


debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Next authentication method: publickey

위 진한 부분에서 느리다면.  서버측에서 GSSAPI 를 지원하면 해당 인증을 먼저 시도하는데, 클라이언트측에서 설정이 안되어 있어서 지연현상이 발생하는 듯 하다.

/etc/ssh/ssh_config ( sshd_config 가 아님 )

    GSSAPIAuthentication no

위 옵션을 no 로 바꿔준다.

서버 관리자가 아닌경우  ~/.ssh/config 에 넣어줘도 된다.




WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

서버관리.

ssh 접속해서 관리할 수 있는 서버의 수는 제한적이다.
스크립트를 작성해서 관리하는 것도 한계가 있다.

자동화 툴을 사용해야 한다.

여러가지 이지만, 하나씩 알아보고 적당한 놈을 찾아보기로 한다.

후보로

1. 모니터링 : Icinga

=> 설정 관련글 : http://blog.1day1.org/547


2. 서버 자동화 : Chef

한번에 여러개를 다 해볼 수는 없고, 일단 후보 먼저 검증해 볼 예정이다.


일단 작은 부분의 관리 부터 검증해봐야 겠다.



WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

ssh 를 사용할때 자주 사용하는 호스트는 config 에 설정해놓으면 편리하다

위치는 자신의 홈디렉토리/.ssh/config 파일이다.

형식은.

Host serv
    hostname serv.domain.kr
    User root
    Port 22
    IdentityFile ~/.ssh/github.key

Host 부분에는 짧은 문자로 적어준다.

Host serv s1

이런식으로 여러개를 적어도 된다.

서버관리를 위해 root 나 특정계정을 적어주면 된다.

직접

ssh serv.domain.kr 

명령을 내리면 현재 로그인상태의 계정으로 접속하게 된다.
관리할 서버들이 동일한 계정이면 상관없는데, 다른 경우가 대부분이라 매번

ssh user@serv.domain.kr

이런 형태로 적는 것은 불편하다.

port 도 마찬가지이다.

기본포트가 22 번이지만, Brute force 공격등을 방지하기 위해 포트번호를 바꾸는 것이 좋기 때문에 Port 번호도 config 에 지정해주면 편하다.


또한 패스워드 없이 바로 접속하기 위해 IdentityFile 을 지정해주는 것도 편리하게 ssh 를 사용하는 좋은 방법이다.
(물론 key 파일은 주의해서 관리한다.)




WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret
ssh 원격 실행을 하고 싶을때
  ssh {host} {명령}
이런식으로 해주면 된다.

그런데, 불편한 메시지가 나온다. 
  Pseudo-terminal will not be allocated because stdin is not a terminal

항상 나오는 것은 아니고, 단일명령을 주면 나오지 않는다.
command.sh 에 실행명령을 작성하고,  ssh {host} < command.sh  형식으로 할때 메시지가 나온다.

그런경우  ssh -t -t (두번)  옵션을 주어 실행하면 된다.

근데, 실행명령이 다 보인다. 

이때는 ssh -T 옵션을 준다.

그런데, 또 불편한 메시지가 보인다.
   TERM environment variable not set.

 ssh 실행시 해당 TERM 환경변수가 설정되지 않아서 그렇다.
타겟서버의 .ssh/environment 파일에(보통 파일이 없다. 그래서 새로 만들고)
  BASH_ENV=.profile
을 추가해준다. (경우에 따라서 .profile 을 .bash_profile 로 변경)

또는 그냥 간단하게, 명령셋에 다음을 추가해준다.
  export TERM=xterm
 
좀 이상하다. 나오다가 지금은 또 안나오네.(TERM ..)
 


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

authorized_keys2 를 .ssh 디렉토리에 넣으면 바로 접속이 가능했다.
그런데, centos6 에서는 계속 비번을 물어본다.

다음명령을 내려준다.

restorecon -R -v /root/.ssh

selinux 와 관련있는듯 하다. 버그라고도 하고.(좀더 살펴봐야 겠다)

selinux 를 끄는게 정답인가?


ps. authorized_keys2 의 권한설정 , sshd_config 를 이리저리 설정해봐도 안되는 경우가 바로 저 문제.
  selinux 를 끄는 것이 좀 찜찜하다면 저 방법으로.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret
원격 파일 전송하는 방법중 scp 와 rsync 를 주로 사용한다.
rsync 도 -e ssh 옵션을 붙여서 쓰니 둘의 차이는 별로 없다.

그런데, scp 의 경우 문제가 있다. 바로 symbolic link 의 처리.

scp -pr {local} {remote}
를 하면  local 의 파일을 원격으로 복사할 수 있다. 서브디렉토리포함, 파일시간 보존등.
그런데, 파일중 symbolic link 가 있다면 링크된 원본파일이 전송된다. symlink 가 유지 되지 않는다.

그런경우 rsync 를 쓴다.

rsync -avzu -e ssh  {local} {remote}
이렇게 하면 된다.
둘중 편한거 쓰면 된다.


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret
rsync + ssh 에 대한 팁은 많다.
그런데, ssh 를 root 로 로그인을 허용해야 하는 방법의 설명이 많다. /etc/ssh/sshd_config 에서
PermitRootLogin yes
로 해야 한다.  그러나 왠지 root 로 허용하는 것은 좀 꺼려지게 된다.
(ssh brute force 공격이 일상화 되어 있기 때문에 더 염려된다.)


root 로 접근은 못하게 하면서,  rsync+ssh 를 쓸 수 없을까?

물론 있다.
PermitRootLogin forced-commands-only
라는 옵션이 있다.

.ssh / authorized_keys  의 public key 에 적어준 명령만 허용하는 옵션이다.
from="192.168.0.1",command="/root/bin/validate-rsync" ssh-dss IEUHFKSJHDOG ....
위 밑줄 친 부분이 추가된 것이다. 딱 보면 감이 올것이다.

from 부분
의 IP 는 허용할 IP주소이다. 이 주소가 제대로 들어가지 않으면..     이런 에러로그를 보게 된다. 허용한 IP가 아니라는 메세지이다.
sshd[21670]: Authentication tried for root with correct key but not from a permitted host (host=backup, ip=192.168.0.1).
from 부분에 IP 를 직접 적어주거나,  /etc/hosts  에 등록해서  host 값을 적어줘도 된다.
from="backup",command="...."
/etc/hosts 에는 다음과 같이 적어준다.
192.168.0.1  backup
도메인을 직접적어주는것은 안되는 듯 하다.


command 부분에 적어준 스크립트를 통해 실행하게 된다.
validate-rsync (이름은 아무거나 상관없음) 의 내용은 다음과 같다.
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac
파일을 만들고, 실행권한을 준다.




참조문서
http://www.linux.com/archive/feature/113847
http://www.debianhelp.co.uk/rsync.htm
http://troy.jdmz.net/rsync/index.html
https://people.chem.umass.edu/wiki/index.php?title=RSYNC_and_SSH_With_Automated_Login
http://www.iwlearn.net/websitetoolkit/help/how-to/using-rsync-and-ssh

http://zakorea.tistory.com/24
http://bluetech.tistory.com/2


WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  0개가 달렸습니다.
secret
1) ssh 의 보안설정
음. ubuntu 의 sshd 는 root 접속을 허용한다.
바로 /etc/ssh/sshd_config 의 설정에서
PermitRootLogin yes
그런데, 보안상 권장하지 않는 방법이다. 일반적으로 no 로 설정해 놓는 것이 좋다.
또는 ssh 의 기본포트인 22 번 포트를 그냥 사용하는 것도 위험하다.

ssh brute force attack 이 끊이 없이 들어온다.
Port 22
의 기본포트를 다른 포트로 변경하는 것이 좋다.


2) root 로 로그인하고 싶을때는 방법이 없나?

간혹 root 로 로그인할 필요가 있다.(사실 거의 없다)
그런데, ssh 옵션에서 PermitRootLogin yes 로 해놓기는 좀 찜찜하다.
그런경우 ssh 접속을 특정 IP(clean IP?? )에서 접속이 가능하도록 해보자.
바로  /etc/hosts.allow 파일이다.
%주의% 잘못 만지면 접속을 못하는 수가 있으니, 원격작업은 가급적 하지 말자. ^^

파일을 열고 이렇게 입력해보자.
sshd: 127. : allow
sshd: 192. : allow
sshd: 210. : allow
sshd: ALL : deny
127, 192 등은 로컬IP 주소이다. 세번째 210. 은 210 으로 시작하는 IP 대역이다.
IP 주소 전체를 사용할 수도 있고, IP 주소를 class 단위로 정할 수도 있다.
(자신이 접속할 주소의 IP 를 적절하게 적어준다.)

또한 IP주소가 아닌 도메인주소로 적어줄 수도 있다.

허용한 대역의 IP 가 아닌경우 접속을 시도하면  다음처럼
ssh_exchange_identification: Connection closed by remote host
연결이 되지 않고 거부하게 된다.

/var/log/auth.log 에도 다음과 같이
sshd[5404]: refused connect from ::ffff:접속한IP주소 (::ffff: 접속한IP주소)
접속을 거부한 로그가 생긴다.


3) 다른 계정은 허용하고, root 계정만 특정IP 에서 접속하게 못하나?

사실 이것을 하기 위해 방법을 찾아보던 중이었다. 아직은 이 방법을 찾지 못하였다.
그래서 일단 2) 번으로 설정중. (방법이 있을 법 한데, 좀더 알아봐야 겠다.)

PermitRootLogin 의 몇가지 옵션으로 처리가 가능할 듯 싶다.
(바로 'force-commands-only'  root 로그인을 public key 인증으로는 허용하는 듯)



WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

트랙백  0 , 댓글  2개가 달렸습니다.
  1. 3번 같은 경우엔 sshd_config 에서
    PermitRootLogin yes
    AllowUsers root@아이피주소 or 호스트이름
    하시면 됩니다.
  2. 우왕ㅋ 2012.10.15 22:47
    이런게 진정 보안이구려! 나 여태 뭐한거여ㅠ
secret