メニューを閉じる

テクノデジタルグループ

メニューを開く

2016.12.29

インフラ

ansibleでお手軽ユーザロック

もうあといくつ寝るとお正月。早くお餅が食べたいです。
fitbitを購入しましたが、もっぱら安眠時間の計測に活躍中です。
こんにちは、あかまつ です。

「チームからメンバーが抜けたからアカウントをロックしたい」なんてこと、よくありますよね。
LDAPとかで管理されていると らくちん なのですが、そうじゃないところもあるかと思います。
全サーバで一括ロックしたい!

ということで ansible でレシピを作ってみました。すごい簡単なものですが。

ansible 管理サーバ:192.168.58.101
管理対象ノード:192.168.58.10[23]

  • レシピ(userlock.yml)
      hosts: all
      vars:
        lockuser: testuser
      tasks:
        - name: Uesr lock
          user: name={{lockuser}} password=!!
    
  • 管理対象ノード(hosts)
    [target]
    192.168.58.102
    192.168.58.103
    

    すごい簡単!

    これを実行してみると、、、

  • (実行前)192.168.58.102

    [root@centos67-102 ~]# id testuser
    uid=501(testuser) gid=501(testuser) 所属グループ=501(testuser)
    [root@centos67-102 ~]# grep testuser /etc/shadow
    testuser:$6$npLmToll$YqPCZShkEcoYUplaAdW91Awm/jjHCZ7iPOGNVCANmP/dq0kbFjQZAos5Qn2hkrbnZfhhFfBk2ifLeamBhtGUU0:17164:0:99999:7:::
    [root@centos67-102 ~]# passwd -S testuser
    testuser PS 2016-12-29 0 99999 7 -1 (パスワード設定済み、SHA512 暗号化。)

  • (実行)192.168.58.101

    [admin@centos67-101 ~]$ ansible-playbook userlock.yml -i hosts -sKk
    SSH password:
    SUDO password[defaults to SSH password]:

    PLAY [Uesr lock] ***************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.58.102]
    ok: [192.168.58.103]

    TASK [Uesr lock] ***************************************************************
    changed: [192.168.58.102]
    changed: [192.168.58.103]

    PLAY RECAP *********************************************************************
    192.168.58.102 : ok=2 changed=1 unreachable=0 failed=0
    192.168.58.103 : ok=2 changed=1 unreachable=0 failed=0

  • (実行後)192.168.58.102

    [root@centos67-102 ~]# id testuser
    uid=501(testuser) gid=501(testuser) 所属グループ=501(testuser)
    [root@centos67-102 ~]# grep testuser /etc/shadow
    testuser:!!:17164:0:99999:7:::
    [root@centos67-102 ~]# passwd -S testuser
    testuser LK 2016-12-29 0 99999 7 -1 (パスワードはロック済み。)

    ロックできました!すごい簡単!!

    ところで、これはユーザが存在しないサーバに対して実行したらどうなるんだろう。。。
    192.168.58.103には実は testuser はいませんでした。

  • (実行前)192.168.58.103

    [root@centos67-103 ~]# id testuser
    id: testuser: そのようなユーザは存在しません
    [root@centos67-103 ~]# grep testuser /etc/shadow
    [root@centos67-103 ~]# passwd -S testuser
    passwd: 不明なユーザー名 ‘testuser’。

  • (実行後)192.168.58.103

    [root@centos67-103 ~]# id testuser
    uid=501(testuser) gid=501(testuser) 所属グループ=501(testuser)
    [root@centos67-103 ~]# grep testuser /etc/shadow
    testuser:!!:17164:0:99999:7:::
    [root@centos67-103 ~]# passwd -S testuser
    testuser LK 2016-12-29 0 99999 7 -1 (パスワードはロック済み。)

    ロックされたユーザが作成されてしまってる!
    「チームからメンバーが抜けたからアカウントをロックしたい」から、ユーザがあったらロックしたかっただけなのに、逆にユーザを作成するというわけのわからんことに!!

    やりたいことはできたけど、余計なことまでやってくれるという、よくある状態です。
    usermod コマンドみたいにユーザがあったらロックして、なければ何もしないでもらいたのですが、user_module ではそこまで気が利くオプションはなさそうです。

    ということで、結局できたレシピはこう。

  • レシピ(userlock.yml)
    - name: Uesr lock
      hosts: all
      vars:
        lockuser: testuser
      tasks:
        - name: Check user exists
          shell: /usr/bin/getent passwd | awk -F":" '$1=="{{lockuser}}"{print $1}'
          register: etc_users
    
        - name: Uesr lock
          user: name={{lockuser}} password=!!
          when: etc_users.stdout == "{{lockuser}}"
    

    実行すると 192.168.58.103 は以下のようにスキップされているのがわかります。

  • (実行)192.168.58.101

    [admin@centos67-101 ~]$ ansible-playbook userlock.yml -i hosts -sKk
    SSH password:
    SUDO password[defaults to SSH password]:

    PLAY [Uesr lock] ***************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.58.102]
    ok: [192.168.58.103]

    TASK [Check user exists] *******************************************************
    changed: [192.168.58.103]
    changed: [192.168.58.102]

    TASK [Uesr lock] ***************************************************************
    skipping: [192.168.58.103]
    changed: [192.168.58.102]

    PLAY RECAP *********************************************************************
    192.168.58.102 : ok=3 changed=2 unreachable=0 failed=0
    192.168.58.103 : ok=2 changed=1 unreachable=0 failed=0

    簡単な処理にshellを使うと負けた感覚になってしまうのは私だけでしょうか。。
    まぁ、普通はどこのサーバにユーザ作ってとか管理されているだろうから、そこに対して実行しなければ良いだけだろうけど。

    皆様もできたことだけ見てしまわぬよう、ご注意を。

    ※ユーザロックというと、「usermod -L testuser」「passwd -l testuser」などで現在のパスワードを保持しつつロックすることが一般的だと思いますが、ansibleのuserモジュールではそのオプションもなさそうなので、今回は「!!」をセットしてロックしています。
    ※パスワードロックしかしていませんが、公開鍵認証の無効化も考慮に入れた方がよいと思います。


  • 【記事への感想募集中!】

    記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
    • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
    • いただいた感想は今後の記事に活かしたいと思います!

    感想フォームはこちら


    【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

    下記項目に1つでも当てはまる方は是非、詳細ページへ!
    • 自分でアプリを作ってみたい
    • ITで世の中にワクワクを生み出したい
    • 使いやすさ、デザインにこだわったWebサイトを開発したい

    採用情報の詳細はこちら


    Qangaroo(カンガルー)

    • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
    • テストの進捗が見える。開発がスマートに進む。
    • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

    【テクノデジタルのインフラサービス】

    当社では、多数のサービスの開発実績を活かし、
    アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
    AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
    詳細は下記ページをご覧ください。

    https://www.tcdigital.jp/infrastructure/

    最近の記事