ssh 보안설정관련


넥스트라인 기술지원부 김삼수(kiss@nextline.co.kr)
 
SSH 환경설정(sshd_config)
SSH 또는 Secure Shell은 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령
을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프
로토콜을 가리킵니다. 기존의 rsh, rlogin, 텔넷 등을 대체하기 위해 설계되었으며, 강력한
인증 방법 및 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공합니다.
기본적으로는 22번 포트를 사용합니다. SSH는 암호화 기법을 사용하기 때문에, 통신이 노출
된다 하더라도 이해할 수 없는 암호화된 문자로 보이기 때문에 보안에 더욱 안전합니다.
설정파일 경로 : /etc/sshd/sshd_config
 
1 기본설정
Protocol 2
openssh는 프로토콜 버전을 원하는 대로 선택할 수 있습니다. protocol 2로 설정에는 서버
는 버전 2로만 작동하기 때문에 ssh1을 사용해 접속을 요청하는 클라이언트를
받아 들일
수 없다. protocol 1로 설정해서 가동시킬 경우에는 버전 2를 사용하는 ssh2 사용자의 요
청을 받아 들일 수 없다. 보안상 protocol 1 은 사용하지 않습니다.
 
KeyRegenerationInterval 3600
서버의 키는 한번 접속이 이루어진 뒤에 자동적으로 다시 만들어진다. 다시 만드는 목적은
나중에 호스트의 세션에 있는 키를 캡처해서 암호를 해독하거나 훔친 키를 사용하지 못하
도록 하기 위함 위함입니다. 값이 0이면 키는 다시 만들어지지 않습니다. 기본값은 3600초
입니다. 이 값은 자동으로 키를 재생성하기 전까지 서버가 대기할 시간을 초단위로 정의합
니다.
 
ServerKeyBits 1024
서버 키에서 어느 정도의 비트 수를 사용할지 정의합니다. 최소값은 512이고 디폴트 값은
768입니다.
 
SyslogFacility AUTH
/etc/syslog.conf에서 정의한 로그 facility 코드입니다. 가능한 값은 DAEMON, USER,
AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7입니다. 기본값은
AUTH입니다. Facilith란 메시지를 생성하는 하위 시스템을 말합니다.
 
LogLevel INFO
로그 레벨을 지정하는 것입니다. 가능한 값은 QUIET, FATAL, ERROR, INFO, VERBOSE 그리고
DEBUGS입니다.
 
LoginGraceTime 600
유저의 로그인이 성공적으로 이루어지지 않았을 때 이 시간 후에 서버가 연결을 끊는 시간
입니다. 값이 0 이면 제한 시간이 없으며 기본값은 600초입니다.

strictModes yes
사용자의 홈 디렉토리인 /home/username의 권한 값 등을 체크하도록 설정되어 있는 지시자
입니다.
 
RSAAuthentication yes
RSA 인증의 시도여부를 정의합니다. ssh1 프로토콜에만 사용하기 위해 예약된 것으로,
ssh1을 사용하고 운영상 보다 안전하게 운영하려면 이 옵션을 yes로 설정해야 합니다.
RSA는 인증을 하기 위해 ssh-keygen 유틸리티에 의해 생성된 공개키 와 비밀키 쌍을 사용
합니다. 현재 문서에서는 보안상 ssh1 프로토콜을 사용하지 않으므로 주석 처리합니다.
 
PubkeyAuthentication yes
 
AuthorizedKeysFile .ssh/authorized_keys
ssh에서 제공하는 인증에는 공개키 인증과 암호 인증법 이렇게 두가지가 있는데, 공개키인
증을 사용할 것인지에 대해 설정하는 것입니다. 공개키 인증 사용시 공개키가 있어야 하므
로 더욱 안전합니다.
 
RhostsAuthentication no
sshd가 rhosts 기반의 인증을 사용할 것인지 여부를 정의합니다. rhosts 인증은 안전하지
못하므로 ‘no’로 합니다.
 
IgnoreRhosts yes
IgnoreRhosts’ 명령은 인증시 rhosts와 shosts 파일의 사용여부를 정의합니다.
보안상의 이유로 인증할 때 rhosts와 shosts 파일을 사용하지 않도록 합니다.
 
RhostsRSAAuthentication no
rhost나 /etc/hosts.equiv파일이 있으면 이것을 사용해 인증합니다. 이것은 보안상 별로
안 좋은 방법이기 때문에 허용하지 않습니다. RSA 호스트 인증과 맞추어 rhosts 인증의 사
용여부를 정의합니다.
 
HostbasedAuthentication no
호스트 기반의 인증 허용 여부를 결정합니다.
 
IgnoreUserKnownHosts yes
ssh 데몬이 RhostsRSAAuthentication 과정에서 각 사용자의 $HOME/.ssh/known_hosts를
무시할 것인지 여부를 정의합니다. rhosts 파일을 허용하지 않았으므로 yes로 설정하는 것
이 안전합니다.
 
PasswordAuthentication yes
패스워드 인증을 허용합니다. 이 옵션은 프로토콜 버전 1과 2 모두 적용됩니다. 인증할 때
암호기반 인증방법의 사용 여부를 결정합니다. 강력한 보안을 위해 이옵션은 항상 ‘ no
‘로 설정해야합니다.
 
PermitEmptyPasswords no
패스워드 인증을 할 때 서버가 비어있는 패스워드를 인정하는 것입니다. 기본 값은 no입니
다.
 
X11Forwarding no
원격에서 X11 포워딩을 허용하는 것입니다. 이 옵션을 yes로 설정하면 xhost보다 안전한
방법으로 원격에 있는 X프로그램을 사용할 수 있습니다.
 
PrintMotd yes
사용자가 로그인 하는 경우 /etc/motd (the message of the day) 파일의 내용을 보여줄 것
인지 여부결정. ssh 로그인을 환영하는 메시지나 혹은 공지사항 같은 것을 적어 놓으면 됩
니다.
 
Subsystem      sftp          /usr/libexec/openssh/sftp-server
sftp는 프로토콜 버전 2에서 사용되는 것으로서 ssh와 같이 ftp의 보안을 강화하기 위해
사용되는 보안 ftp프로그램입니다.
openssh를 설치하면 /usr/local/ssh/libexec/sftp-server파일이 설치됩니다. 이것은 sftp
서버용 프로그램입니다. 클라이언트 sftp프로그램은 설치되지 않습니다. 따라서 서버로 일
단 가동시키고 원도용 ssh클라이언트 프로그램이나 SSH2를 설치하면 sftp를 사용할 수 있
습니다.
 
CheckMail (yes/no)
사용자가 로그인할 때 새메일이 도착했음을 알리도록 하는 기능을 설정하며 기본값은 yes
로 되어있습니다.
 
Cipher (ciher)
세션을 암호화 할 때 사용할 방법을 명시해 줍니다
(idea,des,3des,blowfish,arcfour 또는 없음)
 
ForwardAgent
인증 대리인이 포워드 되어야 하는지를 명시 합니다.
 
KeepAlive yes
 
RequireReverseMapping no
클라이언트에게 aliive메시지를 보낼 것인지 명시하는데 접속하는 곳의 도 메인이 revers
Mapping 이 되는지를 활인하여 접속을 허가할지 안 할지를 지정합니다. 실제로 internet상
에 호스트들 중 revers mapping 이 안 되는 호스트가 상 당수이므로 되도록 no로 설정할
것을 권장합니다. 만약 여러분이 사용하시는 host가 revers mapping 이 확실히 되면 보안
상 yes로 하는 것 이 좋겠지만 revers mapping이 되지 않으면 접속이 불가능 하므로 조심
하십시오.
 
PasswordAuthentication (yes/no)
패스워드 기반의 인증방법을 사용할 것인지를 명시 합니다.
 
PubkeyAuthentication (yes/no)
인증 순서를 지정합니다.



2 보안설정
 
Port 22
ssh가 사용할 기본 포트를 지정합니다. 포트 변경 시 /etc/services 파일에서 sshd 관련
포트 역시 변경할 포트로 변경해 주어야 합니다.
 
AllowUsers root nextline
로그인 허락할 계정 nextline와 root 두 계정에게만 로그인 허용 합니다.
 
PermitRootLogin no
root 로그인 허용여부를 결정하는 것입니다. yes, no, without-password를 사용할 수 있습
니다. 현재 no로 되어 있기 때문에 직접
root로 접속이 불가능합니다. 이옵션을 yes 로
하기보다는 일반계정으로 로그인후 su 명령으로 root로 전환하는 것이 보안상 안전합니다.
 
ListenAddress 0.0.0.0
sshd가 귀를 기울일 주소를 정해줍니다. 0.0.0.0은 모든 곳으로 부터 접속 을 받아들이겠
다는 의미입니다. 하지만 패키징을 할때 어떻게 한것인지는 모르겠지만 tcp-wrapper의 영
향을 받아서 hosts.deny에서 막혀 있으면 접속이 안되니 hosts.allow와 hosts.deny에서
sshd2 항목으로 제어를 할 수가 있습니다.
 
AllowedAuthentications           publickey,password
Sshd2가 제공하는 인증은 password와 publickey 그리고 hostbased 방식이 있는데, 기본 적
으로 public,password가 사용됩니다. 이는 순서대로 인증하는 방법을 보여주는데, 먼저
publickey로 인증하고, 두 번째로 password로 인증한다는 의미입니다.
 
DenyUsers nextline, 3737
접근을 거부할 로컬의 유저를 지정합니다. 위 설정은 nextline 및 uid가 3737인 계정으로
ssh 접속 시도할 경우 접근이 거부됩니다.
 
DenyGroups
명시된 그룹은 ssh서비스에 접근할 수 없도록 하는 기능입니다. (DenyGroups sysadmin
accounting) 와일드카드가 지원되며 공백 문자로 그룹을 구분합니다.
 
DenyHosts
명시된 호스트는 ssh서비스에 접근할 수 없도록 하는 기능을 합니다.
(Deny Hosts shell.ourcompany.net).호스트 IP를 쓰거나 호스트 명을 쓸 수 있으며 와 일
드 카드가 지원되고 공백 문자로 호스트를 구분합니다.
 
AllowHosts           1.2.3.0/24 192.168.1.3
로그인을 허가할 IP 또는 IP 대역을 지정합니다. 여러 개일 경우에는 공란이나 “,” 로
구분하여 나열하면 되고 도메인 이름일 경우에는 reverse mapping이 제공되어야 합니다.
 
AllowGroups
ssh서비스에 접근 가능한 그룹을 명시합니다. (예 : AllowGroups sysadmin accounting) 와
일드카드가 지원되며 공백문자로 그룹을 구분합니다.
 
MaxConnections 0
최대 몇개의 접속을 허락할지를 지정합니다. 0은 제한을 하지 않습니다.
 
PasswordGuesses   3
암호인증 방식으로 인증할 때 최대 몇 차례 시도를 허용할 것인지 지정합니다.
 
ssh1Compatibility       no
클라이언트가 ssh1만 지원할 경우 ssh1 데몬을 실행할 것인지 여부를 지정합니다. ssh1은
보안상 취약하므로 no로 하는 것이 좋습니다.

 

AND


7집설치하시고 설치파일 .7z.001 우클릭해서 extract to "설치파일\"선택하시면 됩니다.
설치후 복사하기.7z 파일도 푸세요.

파일 압축을 풀고( 아래 순서대로 수행하세요)

1. winpcap설치
2. snort 설치 및 환경설정 수정          >>>   리눅스용 설치파일이라  윈도우 디렉토리 경로로바꿈

 c:\snort\etc\snort.conf 이 파일을 수정

 var HOME_NET [자기네트워크/서브넷]      >>수정
                  :  host이름은 사용할 수 없고 CIDR방식으로 서브넷지정     

       주소 지정에서 주소 지정한 부분 앞에 !를 사용하면 그 주소를 제외한 네트워크나                     호스트를 의미하게 됩니다.

예를 들어 !192.1.1.0/24 192.1.1.0 C 클래스 네트워크를 제외한        네트워크를 의미하게 됩니다.   any 는 모든 IP

 ...

 var RULE_PATH c:\snort\rules          >>수정
 var PREPROC_RULE_PATH c:\snort\preproc_rules  >>수정
 .....
 dynamicpreprocessor directory c:\snort\lib\snort_dynamicpreprocessor   >>수정
 ....
 dynamicengine c:\snort\lib\snort_dynamicengine\sf_engine.dll   >>  수정
 ...
 ...
 # output log_tcpdump: tcpdump.log
 output alert_fast: alert.ids              >>>> 이부분 추가
 ...
 ...
 # output database: log, mysql, user=root password=test dbname=db host=localhost
 # output database: alert, postgresql, user=snort dbname=snort
 # output database: log, odbc, user=snort dbname=snort
 # output database: log, mssql, dbname=snort user=snort password=test
 # output database: log, oracle, dbname=snort user=snort password=test
 
output database: alert, mysql, user=root password=qwer1234 dbname=snortdb host=localhost port=3306         >>이부분 추가(한줄임)


 output database: log, mysql, user=root password=qwer1234 dbname=snortdb host=localhost port=3306         >>이부분 추가(한줄임)


 .....


 include classification.config   ==>   include c:\snort\etc\classification.config        >> 수정


 ........


 include $RULE_PATH\local.rules                >>>  밑으로 쭉~ 다 역슬러시 로 수정

 include $RULE_PATH\bad-traffic.rules
 include $RULE_PATH\exploit.rules
 include $RULE_PATH\scan.rules
 

압축 풀기나서 푼 폴더 안에
 설치후복사하기디렉토리안에 rules  디렉토리 통째로 복사해서 c:\snort\rules로 복사
 설치후복사하기디렉토리안에 signature디렉토리 통째로 복사해서 c:\snort\doc아래로 복사
 

3. mysql설치
 설치중간에 멀티유저 15명 체크
 문자설정에서 Best Supprot For Multilingualism 선택
 Path체크
 사용자계정설정  ,  게스트는 로긴은 체크하지말고

 테스트
 # mysql -u root -p

 mysql > show databases;               >>snort 동작시 나중에 뭐가 보여야 된다.
 mysql > exit

4. db 생성 ( snortdb database와 schema도 생성 ----- 정해진 규칙은 c:\sonrt\schemsa\create_mysql  파일에 정해져있음 .  ) 
 # mysqladmin -u root -p create snortdb                 >> 틀만들기
 
 위의 규칙경로로가서
 # mysql -D snortdb -u root -p < create_mysql  
5. 확인
 # mysql -u root -p
 
 mysql > use snortdb
 mysql > show tables;
 
6. 실행 테스트
 c:\snort\bin\snort -W              >>  네트워크 인터페이스 확인
 c:\snort\bin\snort -v -n 3 -i 1   >>  인터페이스 1번에 패킷 3개

 c:\snort\snort.conf 파일을 test
 # snort -T -l c:\snort\log -c c:\snort\etc\snort.conf -i 1
 
 snort existing라고 뜨면 된것임


7. 콘솔이 사용할 db생성 ( dbname : aw_hsc)

 # mysqladmin -u root -p create aw_hsc 
 압축풀고 설치후복사하기 디렉토리안에 hsc.v104.sql   를 c:\snort\schemas\안에 복사

 c:\snort\schemas\ 로 이동후
 # mysql -D aw_hsc -u root -p < hsc.v104.sql

8. 프래임워크 설치 (설치전 확인 : 2.0이상 설치되어 있으면 생략-설치파일디렉토리안에 dotnetfx.exe)

9. 압축푼 디렉토리의 hsc.v2.6.0.4.msi 파일 실행해서 설치 바탕화면에 Homeynet security Consol 바로가기 생김

10. 바탕화면에 배치파일 만들기
 내용은 다음과같이 만들고 저장시 snort.bat로 만들기 형식은 모든파일형식
 
 cd c:\snort\bin
 snort -c c:\snort\etc\snort.conf -l c:\snort\log -i 1

11. 바탕화면에 생긴 Homeynet security Consol 바로가기 실행하기 전에 위에 snort.bat 실행해놓는다.

12. Homeynet security Consol 실행

 

 

 

그림확대해서 보세요

 






snort 사용법

USAGE: snort [-options] <filter options>

 

Options:

        -A 얼럿 모드를 fast,full,none 중의 하나로 지정합니다.

       unsock 을 지정하면 UNIX 소켓을 사용하여 로깅을 한다(아직 시험적이라고 한다).

        -a ARP 패킷을 프린트합니다.

        -b  패킷을 tcpdump 파일로 저장. 바이너리 포맷이므로 저장 속도가 빨라집니다.

        -c <rules> <rules>로 지정된 파일을 룰 파일로 사용합니다.

        -C 패킷의 사용자 데이타 부분을 문자만 프린트. 헥스로는 프린트하지 않습니다.

        -D snort를 데몬 모드로 돌립니다. 터미널을 종료해도 계속 돌게 됩니다.

        -F <bpf>  BPF 필터링식을 <bpf>로 지정된 화일에서 읽어 옵니다.

        BPF 필터링식은 tcpdump에서 원하는 패킷 만을 덤프하기 위해서 사용되는 식입니다.

        -g <gname> snortgid<gname>으로 그룹으로 설정합니다.

        -h <hn> 홈네트워크 변수 HOME_NET<hn>의 값으로 세팅합니다.

        -i <if> <if>로 지정된 네트워크 인터페이스를 모니터링합니다.

        -I     얼럿 결과물에 네트워크 인터페이스 이름을 붙인다.

        -l <ld> <ld>로 지정된 디렉토리에 로그 데이타를 저장합니다.

        -n <cnt> <cnt> 개의 패킷만을 모니터링하고 프로그램을 종료합니다.

        -N       로깅 기능을 사용하지 않습니다. 얼럿만이 저장됩니다.

        -o        룰셋 테스트 순서를 Pass, Alert, Log순서로 바꾼다.

        -O       IP주소를 알 수 없도록 표시한다.

        -p     무작위 모드(promiscuous mode)를 사용하지 않고 스니핑을 합니다.

  스니핑하는 호스트의 MAC 주소로 오는 패킷이나 브로드캐스팅 패킷만을 모니터링합니다.

        -P <snap> 패킷의 스냅렌(snaplen)을 지정합니다. 디폴트는 1514입니다.

                   스냅렌은 캡쳐할 수 있는 패킷의 최대 크기입니다.

        -q        아무런 메시지도 뿌리지 않습니다.

        -r <tf>

                   <tf>로 지정된 tcpdump 파일의 패킷들에 대해서 IDS 엔진을 돌립니다.

        -s

                   얼럿 로그 메시지를 syslog 시스템을 통해 시스템에 보냅니다.

        -S <n=v> 룰 파일의 var 로 지정된 변수를 재정의 할 수 있습니다.
            룰 파일의 변수 n의 값을 v로 지정합니다.

        -t <dir>   초기화 후 <dir> 디렉토리로 chroot합니다.

        -u <uname>   초기화 후 snortuid<uname>의 사용자로 바꿉니다.

        -v             많은 메시지를 뿌립니다.

        -V             버전 정보를 표시합니다.

        -X             링크 레이어의 로우 패킷 데이타를 덤프합니다.

        -e             두번째 레이어의 헤더 정보를 프린트합니다.

        -d             어플리케이션 레이어를 덤프합니다.

        -?             도움말을 보여줍니다.

    <filter options> 위치에 지정되는 필터링 옵션은 tcpdump 같이 BPF를 사용합니다.


 

AND

http://light99.egloos.com/5077208


기존에 ASW1과 ASW2가 잘 통신하고 있었던것을 공격자가 Root 스위치를 가장하여 조작된 BPDU를 보낸다. 
공격자가 루트 스위치가 되면 vm1 port와 vm2 port는 루트 포트가되고 각 스위치의 fa1/2 포트들은 designated포트가 되며 fa1/1포트들 중 한쪽은 designated 포트가 되고 다른 한쪽은 Block포트가 되어 스위치 끼리의 통신이 불가능하게 되 결국 pc들끼리도 통신을 못하게 된다. 

그럼 이 STP attack이 성공하기 위한 조건들을 살펴보자 . 
먼저 각 스위치에 fa1/2포트들이 엑세스 포트가 아닌 트렁크 포트라고 해당 스위치에게 인식시켜야한다. 
다음  

 

AND

Dynamic Trunk Protocol (DTP)

 :  한쪽 포트가 이 트렁크로 셋팅했을때 반대 쪽도 트렁크 포트로 셋팅되게 끔 하는 프로토콜

다중 VLAN환경에서 사용하는 Protocol

트렁크 방식이 두가지 타입 :IEEE 820.1q Cisco ISL

*참고 
mode : 4
가지

trunk

access

dynamic : auto 
desiable (default)

 

취약점 : 스위치 포트의 기본은 :access(VLAN1)    

하지만 한쪽포트에서 trunk포트가 설정되면 DTP 동작에 따라 반대쪽 편도 trunk포트가 된다

공격자가 포트를 임의로 트렁크로 바꾸게끔 할 수 있다.


Trunk포트로 자동설정된다면 문제점 :

STP 계산 기존의 루트 스위치가 변경 토포로지 변경 > blocking port 발생


VTP 
전송 다중 Vlan 환경에서 Vlan정보를 전달함으로써 기존의 Vlan access port에 연결된 pc는 통신을 할 수 가 없다.



대응방법

그래서 수동으로 이 포트는 access port다!!!라고 설정
스위치 포트의 모드를 강제로 지정해준다. 


# switchport mode access

# switchport nonegotiate [협상을 비활성화]


   

AND

Switch에서 Sniffing을 하기 위해서는 SwitchHub로 만들어야 한다.

, Mac table을 꽉 채워버리면 Hub가 된다.


#macof    
 : Mac table
을 채워버리는

 
 

방어하는 방법


switchport port-security


# switchport port-security maximum 3         

: 한 스위치 포트에 최대 3개의 mac주소가 할당가능

# switchport port-security violation restrict

내가 지정한 add 외에는 drop

# switchport port-security mac-address sticky

: 처음에 한번 딱 셋팅되어썬 맥 주소 외에는 변경시 shutdown됨


err-down 을 다시 활성화 시키려면 shut down 한 다음 no shut down 해야한다.

AND