본문 바로가기
IT Information/Network

Softether VPN (오픈소스) 사용자 관리

by foons 2021. 3. 19.
반응형

안녕하세요, 이 프로젝트를 시작하게 된 이유는 보안상의 관계로 사용자 계정을 정리함에 있어서 사용자 관리툴에 접속해서 , 사용자별 접속일자를 구분하고, 구분된 사용자를 수정 , 삭제 , 관리를 해야하는 복잡한 업무를 자동으로 진행될 수 있도록 하기위해 진행되었습니다.


Systems architecture


Softether VPN

softEther VPN은 자유 오픈 소스, 크로스 플랫폼, 멀티 프로토콜 VPN 클라이언트이자 VPN 서버 소프트웨어의 하나로, 쓰쿠바 대학의 노보리 다이유의 박사 논문 연구의 일환으로서 개발되었다. SSL VPN, L2TP/IPsec, 오픈VPN, 마이크로소프트 시큐어 소켓 터널링 프로토콜과 같은 VPN 프로토콜들이 하나의 VPN 서버에서 제공된다. 2014년 1월 4일 GNU 일반 공중 사용권 라이선스를 사용하여 출시되었다.

 

클라우드 환경의 EC2 안에 softether VPN 서버를 구축하였고, 운영중에 있습니다.


Softether VPN SERVER 는 vpncmd라는 명령을 가지고, 서버에서 직접 사용자를 관리 할 수 있고 해당 명령어를 AWX에서 스케줄링을 통

 

하여 사용자를 관리하고 있습니다.

 

expiredate_send_mail.yml (티스토리에서 코드박스안에 길이조절로 \ 구분자를 추가하였는데 만약 정상적으로 작동하지 않는다면 줄바꿈

 

없이 긴 코드로 진행하시면 됩니다)

- hosts: vpnserver
  
  tasks:

    - command: "date +'%Y-%m-%d %H:%M:%S' -d '85 day ago'" 
    
      register: eightytydays

    - command: "date +'%Y-%m-%d %H:%M:%S' -d '90 day ago'"
    
      register: ninetydays

    - command: "date +'%Y-%m-%d %H:%M:%S' -d '120 day ago'"
    
      register: onehundredtwentydays
  • 접속일 기준으로 85 - 90일 메일발송, 90일이상 group 변경, 120일이상 계정삭제 로직을 가지고 진행하였습니다.
    - name: vpncmd UserList up to csv format file make
    
      shell: |
      
      /vpncmd (server location) /(type) /HUB:(hubname) \
      
      /OUT:/tmp/test.csv /CSV /CMD UserList
      
      register: userlist_result
      
      ignore_errors: true
      
      changed_when: |
      
      userlist_result.rc <= 1 \
      
      and userlist_result.stderr == ""
  • vpncmd 명령 사용은 softether vpn 공식 홈페이지에 정리되어 있습니다.
  • /out 옵션으로 csv 형식으로 파일을 만들수 있습니다.
  • 현재 사용자 정보를 test.csv 로 불러옵니다.
   - lineinfile:
    
        dest: /tmp/test.csv
        
        state: absent
        
        regexp: "User"
      
    - lineinfile:
    
        dest: /tmp/test.csv
        
        state: absent
        
        regexp: "Disable"
        
    - lineinfile:
    
        dest: /tmp/test.csv
        
        state: absent
        
        regexp: "(None)"

    - name: Read users from CSV file and return a list
    
      read_csv:
      
        path: /tmp/test.csv
        
        fieldnames: |
        
        User_Name,Full_Name,Group_Name,Description \
        
        Auth_Method,Num_Logins,Last_Login,Expiration_Date \
        
        Transfer_Bytes,Transfer_Packets
        
        delimiter: ','
        
      register: username
      
      delegate_to: "{{ host }}"
  • lineinfile 모듈은 Userlist 정보가 담긴 test.csv 에서 첫줄에 불필요한 정보가 담긴 값을 지우기 위해 사용되었습니다.
  • test.csv 파일안에 포맷을 맞춥니다.
    - mail:
    
        host: 발송주체주소
        
        port: 25
        
        username: username
        
        password: password
        
        from: 발송메일
        
        to: 수신자메일
        
        subject: 제목
        
        body: |
        
            내용
            .
            
      when: | 
      
      "{{(item.Last_Login).split()[0]|to_datetime('%Y-%m-%d') \
      
      < eightytydays.stdout|to_datetime('%Y-%m-%d %H:%M:%S') \
      
      and (item.Last_Login).split()[0]|to_datetime('%Y-%m-%d') \
      
      > ninetydays.stdout|to_datetime('%Y-%m-%d %H:%M:%S')}}"
      
      with_items:
      
        - "{{username.list}}"
        
      delegate_to: "{{ host }}"
  • 조건식에 메일 발송은 85 - 90일 사이에 있는 사람에게 메일을 전달합니다. (softether vpn 유저 정보에서 데이트 포맷을 맞추기 위해 to_datetime('%Y-%m-%d')을 지정해 줬습니다.
  • 위에서 날짜를 register 변수에 담아서 stdout을 불러왔습니다.
  • username 변수에서 각각의 행값을 Loop 돌리기 위해 list로 설정되었습니다.
  - name: expired date user group change

        shell: |
        
        /vpncmd (server location) /(type) /HUB:(hubname) \
        
        /CMD UserSet "{{ item.User_Name }}" /GROUP:Disable \
        
        /REALNAME:none /NOTE:none

        register: change_result

        ignore_errors: true

        when: |
        
        "{{(item.Last_Login).split()[0]|to_datetime('%Y-%m-%d') \
        
        < ninetydays.stdout|to_datetime('%Y-%m-%d %H:%M:%S')}}"

        with_items:

          - "{{username.list}}"
  • 90일이 넘은 사용자를 미리 지정한 disable 그룹에 포함시키는 예제입니다.
  - name: vpncmd disable UserList up to csv format file make

        shell: |
        
        /vpncmd (server location) /(type) /HUB:(hubname) \
        
        /OUT:/tmp/disable.csv /CSV /CMD UserList

        register: dislist_result

        ignore_errors: true

        changed_when: |
        
        dislist_result.rc <= 1 \
        
        and dislist_result.stderr == ""

  - lineinfile:
    
        dest: /tmp/disable.csv
        
        state: absent
        
        regexp: "User"
      
    - lineinfile:
    
        dest: /tmp/disable.csv
        
        state: absent
        
        regexp: "Disable"
        
    - lineinfile:
    
        dest: /tmp/disable.csv
        
        state: absent
        
        regexp: "(None)"      
        
  - name: Read users from CSV file and return a list

        read_csv:

          path: /tmp/ansible/disuser.csv

          fieldnames: |
          
          User_Name,Full_Name,Group_Name,Description \
          
          Auth_Method,Num_Logins,Last_Login,Expiration_Date \
          
          Transfer_Bytes,Transfer_Packets

          delimiter: ','

        register: disusername

        delegate_to: "{{ host }}"

    - name: disable user delete 
    
      shell: "{{ userdel }}"
      
      register: change_result
      
      ignore_errors: true
      
      when: |
      
      "{{(item.Last_Login).split()[0]|to_datetime('%Y-%m-%d') \
      
      < onehundredtwentydays.stdout|to_datetime('%Y-%m-%d %H:%M:%S')}}"
      
      with_items:
      
        - "{{disusername.list}}"

 

  • disable Group을 선별합니다.
  • disable.csv 파일 생성시 불필요한 정보를 삭제합니다.
  • disable.csv 을 filed를 지정하여 username 변수에 담습니다.
  • disable group 사용자중에서 12일이 넘은 사용자는 계정을 삭제합니다.

 

[느낀점]

 

총평

 

자동화 구성을 통하여 작업시간을 단축하고, 자동으로 메일까지 전달하게 되어 모든 회사들이 가지고 있는 고민이라고 생각되는 계정관리를 자동화에 한발 다가선 것 같습니다.

 

TO-BE

  • VPN 등 회사에서 사용하는 모든 계정관리의 자동화를 목표로 하고있습니다.

 

반응형