ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오픈소스로 구성하는 데브옵스 시스템 - Ansible과 AWX를 이용한 예제2
    DevOps 2018. 3. 20. 00:57


    계속해서 Ansible과 AWX를 이용해서 Linux와 Windows 서버를 일괄로 관리 할 수 있는 환경을 구성해 보겠습니다

    지난글에 이어서 이번에는 보안 관련 설정 스크립트 예제 입니다.


    Linux의 보안 관리 (for CentOS7)


    저의 경우 Provisioning이 없는 환경에서 ISMS 심사 기간이 되면 심사 준비와 이후 결함 보완으로 최소 3개월의 시간이 소요 되었습니다. 운영 장비와 VM까지 수백여대가 되는 장비와 application의 설정을 일일히 확인하고 수정하는 작업은 엄청난 노가다 일 수 밖에 없습니다.


    관련하여 이제는 Ansible을 이용한 관리가 가능하도록 아래 예제 코드를 적용해 보았습니다.

    이제 기존 서버는 물론이고 신규 서버가 추가되어도 ansible에서 Template job 실행 버튼만 눌러주면 됩니다.


    1. root 계정 원격 접속 제한

    root 계정은 시스템을 관리하는 매우 중요한 계정 입니다. 시스템 관리자는 대부분 root 계정으로 직접 로그인하도록 하는 것을 방지하고 있습니다. 간혹 root 로그인의 편리함에 원격 접속을 허용하지만, 반드시 계정 접속에 대한 제한 관리가 필요합니다.

    ---

    - hosts: all

      remote_user: ansible

      

      tasks:

        - name: Disable root remote access - commenting pts

          replace: dest=/etc/securetty

                regexp="^pts"

                replace="#pts"

          become: yes

          become_user: root

          

        - name: PermitRootLogin no

          lineinfile: dest=/etc/ssh/sshd_config

                regexp="PermitRootLogin[\s\x20]*(yes|no)"

                line="PermitRootLogin no"

                state=present

          become: yes

          become_user: root


    2. 계정 장금 임계값 설정

    패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측공격(Password Guessing) 발생 시 암호입력 실패 횟수를 적절하게 제한함으로써 자동 공격을 차단하고 공격 시간을 지체시켜 패스워드 유출 위혐을 줄입니다.

    ---

    - hosts: all

      remote_user: ansible


      tasks:

        - name: modify auth required

          lineinfile: dest=/etc/pam.d/system-auth

                regexp="^auth[\s\x20]*required[\s\x20]*(pam_env.so|pam_tally2.so)"

                line="auth        required      pam_tally2.so deny=5 unlock_time=120 no_magic_root"

                state=present

          become: yes

          become_user: root  

          

        - name: modify account requisite

          lineinfile: dest=/etc/pam.d/system-auth

                regexp="^account[\s\x20]*required[\s\x20]*(pam_unix.so|pam_tally2.so)"

                line="account     required      pam_tally2.so no_magic_root reset"

                state=present

          become: yes

          become_user: root        

          

        - name: modify password requisite

          lineinfile: dest=/etc/pam.d/system-auth

                regexp="^password[\s\x20]*requisite"

                line="password    requisite     pam_cracklib.so try_first_pass retry=3 lcredit=1 dcredit=-1 ocredit=1"

                state=present

          become: yes

          become_user: root            


        - name: modify password sufficient

          lineinfile: dest=/etc/pam.d/system-auth

                regexp="^password[\s\x20]*sufficient*"

                line="password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=1"

                state=present

          become: yes

          become_user: root 


        - name: modify auth required

          lineinfile: dest=/etc/pam.d/password-auth

                regexp="^auth[\s\x20]*required[\s\x20]*(pam_env.so|pam_tally2.so)[\s\x20]*"

                line="auth        required      pam_tally2.so deny=3 unlock_time=60"

                state=present

          become: yes

          become_user: root


        - name: modify account required

          lineinfile: dest=/etc/pam.d/password-auth

                regexp="^account[\s\x20]*required[\s\x20]*(pam_unix.so|pam_tally2.so)[\s\x20]*"

                line="account     required      pam_tally2.so"

                state=present

          become: yes

          become_user: root


    3. 패스워드 사용기간 및 최소길이 설정

    악의적인 사용자에게 유출된 패스워드를 계속적으로 사용하지 못하도록 패스워드 사용기간을 설정합니다.

    또한 사용자가 패스워드 설정시 최소자리 이상을 설정하도록 셋팅 합니다.

    ---

    - hosts: all

      remote_user: ansible


      tasks:

        - name: modify password max days

          lineinfile: dest=/etc/login.defs

                regexp="^PASS_MAX_DAYS[\s\x20]*[0-9]*"

                line="PASS_MAX_DAYS  90"

                state=present

          become: yes

          become_user: root


        - name: modify password min days

          lineinfile: dest=/etc/login.defs

                regexp="^PASS_MIN_DAYS[\s\x20]*[0-9]*"

                line="PASS_MIN_DAYS  1"

                state=present

          become: yes

          become_user: root


        - name: modify password min length

          lineinfile: dest=/etc/login.defs

                regexp="^PASS_MIN_LEN[\s\x20]*[0-9]*"

                line="PASS_MIN_LEN    8"

                state=present

          become: yes

          become_user: root


    4. Session Timeout 설정

    관리자가 계정을 접속하고 방치될 경우 다른 사용자에게 시스템이 노출되어 악의적인 목적으로 사용될 수 있으므로 일정 시간 이후 아무런 이벤트가 발생하지 않으면 연결을 종료시키도록 Session Timeout을 설정 합니다.

    ---

    - hosts: all

      remote_user: ansible


      tasks:

        - name: set time out 900s

          lineinfile: dest=/etc/profile

                regexp="^(export|EXPORT)[\s\x20]*TMOUT=[0-9]*"

                line="export TMOUT=900"

                state=present

          become: yes

          become_user: root


    5. 불필요 계정 삭제

    OS나 Package 설치 시 Default로 생성되는 계정(특히 FTP)은 대부분 Default 패스워드를 사용하는 경우가 많아 패스워드 추측공격에 노출 될 수 있습니다. 이를 방지하기 위해 Default 계정 및 사용하지 않는 계정은 삭제하도록 합니다.

    ---

    - hosts: all

      remote_user: ansible


      tasks:

        - name: Anonymous FTP User Delete

          user: name="{{ del_user }}"

                state=absent

                remove=yes

                force=yes

          become: yes

          become_user: root

    해당 Job을 만들 때, EXTRA VAIRABLES 입력란에 아래와 같이 key: value 조합으로 값을 입력 합니다.


    6. /etc/passwd 파일 소유자 및 권한 설정

    /etc/passwd 파일은 사용자의 ID, 패스워드, UID, GID 등의 정보를 담고 있기에 관리자 이외의 사용자가 접근하지 못하도록 제한 합니다.

    ---

    - hosts: all

      remote_user: ansible


      tasks:

        - name: chagne file owner

          file: path=/etc/passwd

                owner=root

                group=root

                mode=0644

          become: yes

          become_user: root


Designed by Tistory.