암호를 아무리 길고 사전에 없는 해괴한 형태로 만든다 한 들, 인간이 암기하고 입력할 수 있는 암호에는 기억력과 시간의 한계가 있다. 반면 컴퓨터의 처리속도는 인간의 것에 비할 바가 아니기에 Brute-force 공격앞에 당해낼 재간이 없다. 모든 경우의 수를 빠르고, 누락되는 것 없이, 쉬지도 않고 될 때까지 시도한다. 따라서 아무나 접근할 수 있는 공개된 네트워크에서 서버를 보호하려면 일반적인 계정 인증이 아닌 다른 인증 방법을 심도있게 고려하여야 한다.

 

공개키 인증방식은 임의의 장문을 생성하여 보관하고 그것으로 데이터를 암호화, 복호화 한다. 그리고 암호화, 복호화에 사용되는 키가 다르므로 대칭키에 비하여 키의 유출로 인한 위협을 줄일 수 있다. 나아가 그 개인키도 공인인증서처럼 암호를 걸어 사용할 수 있다. 대신 개인키를 잃어버리면 주인도 못 들어간다.

 

암호를 사용한 SSH 접속의 설정을 완료한 상태에서 시작합니다.

 

암호 인증 SSH부터 구축하려면: 2018/09/04 - [CentOS 7] 내가 정한 포트로 SSH 구현하기

 

 

 

 

0. SSH에 사용할 공개키, 개인키 쌍을 만든다. 개인키는 유출에 각별히 주의한다.

 

공개키, 개인키는 단일 장치에서 동시에 만들어서 공개키는 서버에 두고, 개인키는 사용자가 보유해야한다.

 

키 쌍은 서버에서도, 클라이언트에서도 만들 수 있으나 개인키의 보안이 훨씬 중요하므로 클라이언트에서 만들고 키 쌍을 만들고 공개키를 서버에 업로드 하는 것이 바람직 할 것이다. 물론 반대로 해도 안되는 것은 아니다.

 

윈도우에서는 Xshell이나 Putty, 리눅스에서는 ssh-keygen 등을 사용해 키 쌍을 만들 수 있다.

 

키는 대체로 1024 비트 이상이 권장된다.

 

 

위의 것이 개인키, 아래의 것(*.pub)이 공개키이다.

 

 

 

1. 공개키를 저장할 폴더를 만들고 권한을 지정한다.
[glacier@glacier ~]$ mkdir ~/.ssh -m 700
[glacier@glacier ~]$ ls -al ~ | grep ssh
drwx------.  2 glacier glacier 4096 12월 24 12:36 .ssh

 

 

 

2. 공개키를 업로드하고 권한을 지정한다.
[glacier@glacier ~]$ vi ~/.ssh/authorized_keys
[glacier@glacier ~]$ chmod 600 ~/.ssh/authorized_keys 

SCP도 좋고 파이프도 좋지만 가장 쉬운 방법, 공개키를 텍스트에디터로 열어서 복사, vi열고 붙여넣기 해도 된다.

 

 

 

3. 키가 있는 경로에 "ssh_home_t" 보안 컨텍스트가 있는지 확인한다. (아닌 경우 restorecon -Rv ~/.ssh)

[glacier@glacier ~]$ ls -alZ ~/.ssh
drwx------. glacier glacier unconfined_u:object_r:ssh_home_t:s0 .
drwx------. glacier glacier unconfined_u:object_r:user_home_dir_t:s0 ..
-rw-------. glacier glacier unconfined_u:object_r:ssh_home_t:s0 authorized_keys

 

 

 

4. /etc/ssh/sshd_config 를 수정한다.

[glacier@glacier ~]$ sudo vi /etc/ssh/sshd_config

StrictModes yes
#로그인을 허가하기 전 사용자의 홈폴더 권한을 검사
PubkeyAuthentication yes
#공개키인증 활성화
AuthorizedKeysFile .ssh/authorized_keys
#공개키경로 지정
ChallengeResponseAuthentication no
#로그인 시도에 대하여 답변 메시지를 보내지 않음

#RSAAuthentication yes
#설정할 필요 없음. SSHv1에서만 사용되는 옵션.
#UsePAM no
#설정금지. RHEL 미지원으로 문제가 발생할 가능성 있음.

 

 

 

5. sshd를 재시작하고 개인키로 SSH 접속을 시도해본다.

[glacier@glacier ~]$ sudo systemctl restart sshd

 

 

 

6. 성공했다면 /etc/ssh/sshd_config 를 수정하여 패스워드 인증을 끄고 sshd를 재시작한다.

[glacier@glacier ~]$ sudo vi /etc/ssh/sshd_config

PasswordAuthentication no

[glacier@glacier ~]$ sudo systemctl restart sshd

 

 

 

참고:

 

https://www.server-world.info/en/note?os=CentOS_7&p=ssh&f=4

https://www.hugeserver.com/kb/secure-ssh-on-centos-7/

https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-centos7

https://www.ibm.com/support/knowledgecenter/ko/SSIGMP_1.0.0/pim/unixandlinux/install_config/t_key_unilinux.htm?cp=SSRMWJ_7.0.1.10

https://www.ibm.com/support/knowledgecenter/ko/SSPFMY_1.3.3/com.ibm.scala.doc/config/iwa_config_secure_streaming.html

https://wiki.centos.org/HowTos/Network/SecuringSSH#head-9c5717fe7f9bb26332c9d67571200f8c1e4324bc

Posted by 비형랑#
:




Samba는 SMB를 사용하여 이기종 간의 자원 공유를 위해 만들어진 프로그램중 하나이다. 구현도 쉽고 사용이 편리해 널리 사용되고 있으나, 이미 사용하고 있는 사람조차도 그것이 Samba라는 것을 모를 수 있다. 일례로 윈도우의 폴더 공유가 바로 Samba이다.


Samba 서버를 CentOS에서 구축할 때, 메뉴얼의 절반 이상이 SELinux를 끄라고 한다. 그 이유는 아마도 SELinux에 대한 자료가 많이 없어서 정확한 설정이 어렵기 때문일 것이다. 나도 그동안 SELinux를 딱히 신경쓰지 않았지만 이번에 새롭게 CentOS 7 서버를 구축하면서 정석대로 해보기로 했다. 본래 눈앞의 쉬운 길도 돌아가는 성격인데다, 보안만큼은 타협하고 싶지 않았기 때문이다. 거기다 SELinux는 사실 NSA가 개발한 보안 커널을 리눅스에 이식한 것이라고 한다. 미 국가안보국의 보안 커널이 구동되는 서버라니 말만 들어도 멋지지 않은가.

자업자득이라고, 그 결과로 SMB 서버를 구축하는데 이틀이란 시간이 걸리게 되었다. SELinux의 개념이 생소해서 명령의 의미를 정확히 하기가 쉽지 않았다. 그리고 사실 완성은 하루만에 했지만 다음날 다시 안되서 삽질을 하루 더 했다는 슬픈 이야기. 거짓말 조금 보태서 항목 하나 바꾸고 서비스 재가동, 그리고 확인하기를 한 300번은 한 것같다. 그리고 남은건 데이터를 충실히 암호화하고 필요하지 않은 권한을 주지 않는 정말 믿음직한 서버.


쓸데 없는 설정은 빼고, SELinux를 끄지 않은 상태에서 정석대로 구축해

현재까지 실제로 매우 원활하게 사용하고 있는 설정입니다.


최신 버전의 업데이트가 설치된 CentOS 7에서 구축하였습니다. (2018.12.24 기준)





0. Samba가 설치되어있는지 확인한다. (설치되어있지 않다면 sudo yum install samba)

[glacier@glacier ~]$ rpm -qa samba
samba-4.8.3-4.el7.x86_64


1. SMB 서버에 접근할 2개의 계정을 만들고 단일 그룹에 소속시킨다.
[glacier@glacier ~]$ sudo groupadd testgroup
[glacier@glacier ~]$ sudo useradd testuser1
[glacier@glacier ~]$ sudo useradd testuser2
[glacier@glacier ~]$ sudo passwd testuser1
testuser1 사용자의 비밀 번호 변경 중
새  암호:
새  암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.
[glacier@glacier ~]$ sudo passwd testuser2
testuser1 사용자의 비밀 번호 변경 중
새  암호:
새  암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.
[glacier@glacier ~]$ sudo usermod testuser1 -a -G testgroup
[glacier@glacier ~]$ sudo usermod testuser2 -a -G testgroup
[glacier@glacier ~]$ sudo groupmems -g testgroup -l
testuser1  testuser2


2. 1에서 생성한 계정을 SMB에 등록한다.

[glacier@glacier home]$ sudo smbpasswd -a testuser1
New SMB password:
Retype new SMB password:
[glacier@glacier home]$ sudo smbpasswd -a testuser2
New SMB password:
Retype new SMB password:
Added user testuser2.


3. SMB로 공유할 폴더를 만들고 소유자와 권한을 조정한다.

[glacier@glacier ~]$ sudo mkdir /samba
[glacier@glacier ~]$ sudo mkdir /samba/test
[glacier@glacier ~]$ sudo chown testuser1:testgroup /samba/test -R
[glacier@glacier ~]$ sudo chmod 770 /samba/test -R
[glacier@glacier ~]$ ls -al /samba/test
drwxrwx---.   2 testuser1 testgroup  4096 12월 21 18:26 test


4. SMB설정을 입력한다.

[glacier@glacier ~]$ sudo vi /etc/samba/smb.conf

#[global] 항목은 samba 전역에 적용되는 설정,
#[test] 항목은 test 에만 적용되는 설정이다.

[global]
        workgroup = WORKGROUP
        security = user

        passdb backend = tdbsam

        netbios name = glacier
        server max protocol = SMB3_11
        #서버에서 구동할 최고 신형 버전 지정
        server min protocol = SMB2_10
        #서버에서 구동할 최고 구형 버전 지정(Windows 7해당)
        smb encrypt = required
        #데이터를 반드시 암호화
        kerberos encryption types = strong
        #아래는 수정하지 않으면 적용되는 기본값으로 입력할 필요 없음.
        #guest ok = no
        #disable netbios = no
        #server role = standalone
        #encrypt passwords = yes
        #client plaintext auth = no
        #unix charset = UTF=8
        #deadtime = 0
        #max connections = 0
        #hide dot files = yes

[test]
        writeable = yes
        path = /samba/test
        hosts allow = 192.168.23.0/255.255.255.0
        valid users = @testgroup
        write list = testuser1, testuser2
        force create mode = 0770
        create mask = 0770
        force directory mode = 0770
        directory mask = 0770
        force group = testgroup
        #아래는 수정하지 않으면 적용되는 기본값으로 입력할 필요 없음.
        #available = yes
        #browseable = yes

#null passwords 옵션은 구식으로 사용 금지.


5. SMB설정을 검증한다.

[glacier@glacier ~]$ testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[test]"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions
^C


6. SMB를 재시작하고 부팅시 자동으로 시작하도록 설정한다.

[glacier@glacier ~]$ sudo systemctl restart smb
[glacier@glacier ~]$ sudo systemctl enable smb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
[glacier@glacier ~]$ systemctl status smb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
   Active: active (running) since 금 2018-12-21 18:56:12 KST; 28s ago
     Docs: man:smbd(8)
           man:samba(7)
           man:smb.conf(5)
Main PID: 66117 (smbd)
   Status: "smbd: ready to serve connections..."
   CGroup: /system.slice/smb.service
           ├─66117 /usr/sbin/smbd --foreground --no-process-group
           ├─66123 /usr/sbin/smbd --foreground --no-process-group
           ├─66124 /usr/sbin/smbd --foreground --no-process-group
           └─66125 /usr/sbin/smbd --foreground --no-process-group

12월 21 18:56:12 glacier systemd[1]: Starting Samba SMB Daemon...
12월 21 18:56:12 glacier smbd[66117]: [2018/12/21 18:56:12.253372,  0] ../lib/util/become_daemon.c:138(daemon_ready)
12월 21 18:56:12 glacier smbd[66117]:   daemon_ready: STATUS=daemon 'smbd' finished starting up and ready to serve c...ctions
12월 21 18:56:12 glacier systemd[1]: Started Samba SMB Daemon.
Hint: Some lines were ellipsized, use -l to show in full.


7. 방화벽을 Samba 서비스에 접근할 수 있도록 설정한다.

[glacier@glacier ~]$ sudo firewall-cmd --zone=public --add-service=samba --permanent
success
[glacier@glacier ~]$ sudo firewall-cmd --reload
success
[glacier@glacier ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: ssh dhcpv6-client samba
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


8. Samba와 관련된 SE불린 항목을 조정한다.

[glacier@glacier ~]$ getsebool -a | grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_load_libgfapi --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
tmpreaper_use_samba --> off
use_samba_home_dirs --> off
virt_use_samba --> off
[glacier@glacier ~]$ sudo setsebool -P samba_export_all_rw on


8-1. 항목별 설명을 보고 싶다면

[glacier@glacier ~]$ sudo semanage boolean -l | grep samba
samba_export_all_rw            (비활성  , 비활성 )  Allow samba to export all rw
samba_domain_controller        (비활성  , 비활성 )  Allow samba to domain controller
samba_portmapper               (비활성  , 비활성 )  Allow samba to portmapper
samba_export_all_ro            (비활성  , 비활성 )  Allow samba to export all ro
use_samba_home_dirs            (비활성  , 비활성 )  Allow use to samba home dirs
samba_create_home_dirs         (비활성  , 비활성 )  Allow samba to create home dirs
virt_use_samba                 (비활성  , 비활성 )  Allow virt to use samba
tmpreaper_use_samba            (비활성  , 비활성 )  Allow tmpreaper to use samba
samba_share_fusefs             (비활성  , 비활성 )  Allow samba to share fusefs
samba_share_nfs                (비활성  , 비활성 )  Allow samba to share nfs
samba_run_unconfined           (비활성  , 비활성 )  Allow samba to run unconfined
samba_load_libgfapi            (비활성  , 비활성 )  Allow samba to load libgfapi
sanlock_use_samba              (비활성  , 비활성 )  Allow sanlock to use samba
samba_enable_home_dirs         (비활성  , 비활성 )  Allow samba to enable home dirs


9. 3에서 만든 폴더에 "samba_share_t"컨텍스트를 추가한다.

[glacier@glacier ~]$ sudo semanage fcontext -a -t samba_share_t "/samba(/.*)?"
[glacier@glacier ~]$ sudo semanage fcontext --list | grep samba_share_t
/samba(/.*)?                                   all files          system_u:object_r:samba_share_t:s0


10. 9에서 추가한 컨텍스트가 적용되도록 컨텍스트 복구명령을 실행한다.

[glacier@glacier ~]$ sudo restorecon -R -v /samba restorecon reset /samba context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:samba_share_t:s0 restorecon reset /samba/test context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:samba_share_t:s0 [glacier@glacier ~]$ sudo ls -alZ /samba/test drwxrwx---. testuser1 testgroup unconfined_u:object_r:samba_share_t:s0 . drwxrwx---. testuser1 testgroup unconfined_u:object_r:samba_share_t:s0 ..



11. 클라이언트에서 서버에 접근해보고, 설정한 대로 구동되고 있는지 확인한다.

[glacier@glacier ~]$ sudo smbstatus

Samba version 4.8.3
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing              
----------------------------------------------------------------------------------------------------------------------------------------
89907   testuser1    testuser1    192.168.23.1 (ipv4:192.168.23.1:56591)    SMB3_11           AES-128-CCM          partial(AES-128-CMAC)

Service      pid     Machine       Connected at                     Encryption   Signing     
---------------------------------------------------------------------------------------------
test         89907   192.168.23.1  월 12월 24 14시 02분 05초 2018 KST AES-128-CCM  AES-128-CMAC

Locked files:
Pid          Uid        DenyMode   Access      R/W        Oplock           SharePath   Name   Time
--------------------------------------------------------------------------------------------------
89907        1001       DENY_NONE  0x100080    RDONLY     NONE             /samba/test   .   Mon Dec 24 14:02:05 2018




참고:

https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html

https://selinuxproject.org/page/SambaRecipes

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-working_with_selinux-selinux_contexts_labeling_files

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-selinux_contexts_labeling_files-persistent_changes_semanage_fcontext

https://www.lesstif.com/pages/viewpage.action?pageId=18219472

Posted by 비형랑#
:

 

 

이전에 1.5.3버전으로 작성한 것이 있으나


최신버전의 설정에 변화가 생겨서 새로 설치하는 겸, 한번 정리해서 올려봅니다.


설치가 조금 번거로워서 그렇지, 한 번 하고나면 패킷트레이서는 쳐다보지도 않게 됩니다.


지원되는 명령어가 압도적으로 많은건 당연하고,


실제 망의 장비나 VMware의 가상머신과 붙일 수 있기 때문에 확장성이 비할 바가 못 됩니다.

정말 못할게 없어져요.


단언컨대 GNS3, VMware만 있다면 실습환경 구축 끝입니다.




0. GNS3는 설치되어 있다고 가정합니다.


없으신 분은 아래에서 계정만드시고 로그인 하면 무료로 받을 수 있습니다.


현재 최신버전은 2.1.11이네요.

 

GNS3 다운로드: https://www.gns3.com/software/download


 

1. IOU 이미지 구하기


IOU 이미지라 함은 시스코 스위치의 가상구동용 OS라 생각하시면 됩니다.


IOU는 L2, L3가 있는데 정확하진 않지만 L2가 스위치, L3가 라우터인 듯 합니다.


구글에 "cisco iou image" 로 검색하면..?



2. IOU 키젠 구하기


IOU라는 시뮬이 프리웨어가 아닙니다. 따라서 인증된 키파일이 있어야 사용이 가능합니다.


다행인건 이 키파일을 만드는 것이 매우 쉽다는 거죠.


키젠으로 키값을 알아내고 텍스트파일로 만들어 넣어주면 됩니다.


이 키값이 디바이스마다 상이하므로 GNS3 VM 내에서 알아내야 합니다.


키젠은 파이썬으로 작성되어 있습니다.


처음 IOU를 사용할 때가 파이썬 버전2.7에서 3으로 넘어갈 때라.. 삽질을 했던 기억이 나네요.

 

아래분께 지금도 참 감사합니다.

 

 

 


http://forum.gns3.net/download/file.php?id=2950



3. GNS3 가상머신 파일(*.ova) 다운로드


스위치 운영체제인 CatOS는 IOU방식으로 구동되므로 다이나밉스에서 구동이 불가능합니다.


리눅스기반의 가상머신이 필요합니다.


참고로 GNS3와 GNS3 가상머신의 버전이 서로 일치해야 합니다.


같은 시점에서 다운로드 하신다면 신경쓰실일 없겠지만요.


가상머신의 버전도 2.1.11입니다.


다운받은 zip파일을 풀면 ova파일이 있습니다.


GNS3 가상머신 다운로드: https://www.gns3.com/software/download-vm




4. 가상화 프로그램 설치


GNS3 가상머신을 구동시켜줄 가상화 프로그램을 설치해야합니다.


VMware Workstation Player(비상업용), Oracle VirtualBox는 무료입니다.


VMware Workstation Player 다운로드: https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html


Oracle VirtualBox 다운로드: https://www.virtualbox.org/wiki/Downloads




5. 가상화 프로그램에서 GNS3 가상머신 불러오기


위에서 다운로드한 ova파일을 가상머신으로 만들 차례입니다.


GNS3 VM.ova를 실행해서 가상화 프로그램에 올립니다.

 

부팅이 끝나면 GNS3 VM의 IP주소가 나옵니다.

 

 

 

 

 

 

6. GNS3와 GNS3 VM 연동시키기

 

GNS3가 GNS3 VM을 인식하고, GNS3의 다이나밉스와 VM이 서로 같은 망에 있도록 해야합니다.

 

다이나밉스 서버는 본래 127.0.0.1에 바인딩 되도록 되어있으므로

 

GNS3 VM과 같은 망에 바인딩되도록 설정을 조정해야 합니다.

 

참고로 다이나밉스 서버를 네트워크에 연결된 어댑터에 바인딩하면

 

다른 PC에서도 가상화된 장비의 콘솔에 접근할 수 있게 됩니다.

 

만약 그렇게 한다면 GNS3 VM도 브리지로 구성해서 같은 네트워크에 붙여야 겠죠.

 

GNS3 메뉴의 Edit를 눌러 Preferences를 열고,

 

Server항목의 Host binding을 위 화면에서 본 GNS3 VM와 같은 망의 어댑터를 지정해줍니다.

 

 

 

 

다음 GNS3 VM 항목으로 넘어가서, Enable the GNS VM을 체크하고,

 

Virtualization engine과 VM name을 지정해줍니다.

 

 

 

 

설정이 잘 되면 아래처럼 서버리스트에 GNS3 VM이 추가되고 구동중이라는 것이 보입니다.

 

 

 

 

이렇게 GNS3와 GNS3 VM의 연동은 끝났습니다.

 

 

 

7. IOU키젠 업로드 및 라이센스 파일 만들기

 

앞서 언급했던 것처럼 키젠을 GNS3 VM에서 구동하고 키값을 알아내야 합니다.

 

이전과 바뀐 점이라면 이젠 웹에서 업로드가 아예 불가능합니다. 1.4버전부터 막혔다네요.

 

 

 

 

저번처럼 GNS3 VM에 lrzsz를 설치해서 올릴수도 있지만 이번엔 SFTP로 올려봅니다.

 

 

 

 

이제 콘솔을 열어서

 

 

 

 

python3 CiscoIOUKeygen.py 명령으로 키젠을 돌려주면 키값이 보입니다.

 

메모장으로 IOURC.txt 파일을 만들어서 안에

 

[license]

gns3vm = 73635fd3b0a13ad0;

 

이라고 적어서 저장해주시면 됩니다. 키값 끝에는 세미콜론이 있어야 합니다.

 

 

 

8. 라이센스파일 등록 및 IOU 이미지 업로드

 

GNS3 Preferences를 열고 IOS on UNIX 항목을 선택합니다.

 

Browse를 눌러 IOURC.txt 파일을 지정하면 이전에 입력한 값이 보입니다.

 

 

 

 

이제 드디어 IOU 이미지를 올립니다. IOU Devices 에서 New를 눌러줍니다.

 

 

 

 

Browse를 누르고 IOU 이미지를 선택하면 저절로 GNS3 VM에 업로드됩니다. Type은 일치되는 값으로 지정합니다.

 

 

 

 

IOU 장비가 추가되었습니다.

 

 

 

 

장비리스트에서 끌어다 놓으면 콘솔포트가 할당됩니다.

 

 

 

 

Xshell로 접속해보면 부팅되는 것이 보입니다.

 

 

 

 

스위치에서만 적용되는 명령인 이더채널을 확인해봅니다.

 

 

 

 

최신버전의 GNS3 v2.1.11 에서 시스코 스위치 부팅 성공!

Posted by 비형랑#
: