Add a periodic cleanup script for stage users
Signed-off-by: Aurélien Bompard <aurelien@bompard.org>
This commit is contained in:
parent
3719dff88e
commit
3ddc3934da
5 changed files with 176 additions and 20 deletions
24
roles/ipa/server/files/cleanup-stage-users.py
Normal file
24
roles/ipa/server/files/cleanup-stage-users.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import socket
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
from python_freeipa import ClientMeta
|
||||||
|
|
||||||
|
KEEP_DAYS = 7
|
||||||
|
|
||||||
|
os.environ["KRB5_CLIENT_KTNAME"] = "/etc/krb5.sys-cleanup-stage-users.keytab"
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
client = ClientMeta(hostname)
|
||||||
|
client.login_kerberos()
|
||||||
|
threshold = datetime.utcnow() - timedelta(days=KEEP_DAYS)
|
||||||
|
for user in client.stageuser_find()["result"]:
|
||||||
|
username = user["uid"][0]
|
||||||
|
created_on = datetime.strptime(
|
||||||
|
user["fascreationtime"][0]["__datetime__"], "%Y%m%d%H%M%SZ"
|
||||||
|
)
|
||||||
|
if created_on > threshold:
|
||||||
|
continue
|
||||||
|
print(f"Deleting old stage user: {username}")
|
||||||
|
client.stageuser_del(username)
|
|
@ -213,7 +213,6 @@
|
||||||
shell: echo "{{ipa_admin_password}}" | kinit admin
|
shell: echo "{{ipa_admin_password}}" | kinit admin
|
||||||
tags:
|
tags:
|
||||||
- ipa/server
|
- ipa/server
|
||||||
- keytab
|
|
||||||
- config
|
- config
|
||||||
- krb5
|
- krb5
|
||||||
when: ipa_initial
|
when: ipa_initial
|
||||||
|
@ -292,6 +291,7 @@
|
||||||
name: fas_sync
|
name: fas_sync
|
||||||
givenname: FAS
|
givenname: FAS
|
||||||
sn: Sync
|
sn: Sync
|
||||||
|
userclass: system
|
||||||
ipaadmin_password: "{{ ipa_admin_password }}"
|
ipaadmin_password: "{{ ipa_admin_password }}"
|
||||||
tags:
|
tags:
|
||||||
- ipa/server
|
- ipa/server
|
||||||
|
@ -412,6 +412,7 @@
|
||||||
# (if unset, IPA will assume the password is expired because it hasn't been set by the user themselves)
|
# (if unset, IPA will assume the password is expired because it hasn't been set by the user themselves)
|
||||||
passwordexpiration: "2050-05-13 00:00:00"
|
passwordexpiration: "2050-05-13 00:00:00"
|
||||||
update_password: on_create
|
update_password: on_create
|
||||||
|
userclass: system
|
||||||
ipaadmin_password: "{{ ipa_admin_password }}"
|
ipaadmin_password: "{{ ipa_admin_password }}"
|
||||||
tags:
|
tags:
|
||||||
- ipa/server
|
- ipa/server
|
||||||
|
@ -537,11 +538,13 @@
|
||||||
when: ipa_initial
|
when: ipa_initial
|
||||||
|
|
||||||
|
|
||||||
|
- import_tasks: scripts.yml
|
||||||
|
|
||||||
|
|
||||||
- name: Destroy admin ticket
|
- name: Destroy admin ticket
|
||||||
command: kdestroy -A
|
command: kdestroy -A
|
||||||
tags:
|
tags:
|
||||||
- ipa/server
|
- ipa/server
|
||||||
- keytab
|
|
||||||
- config
|
- config
|
||||||
- krb5
|
- krb5
|
||||||
when: ipa_initial
|
when: ipa_initial
|
||||||
|
@ -646,21 +649,3 @@
|
||||||
tags:
|
tags:
|
||||||
- ipa/server
|
- ipa/server
|
||||||
- config
|
- config
|
||||||
|
|
||||||
|
|
||||||
- name: Ensure python dep is present
|
|
||||||
pip:
|
|
||||||
name: python-freeipa
|
|
||||||
tags:
|
|
||||||
- ipa/server
|
|
||||||
- otp_script
|
|
||||||
|
|
||||||
- name: Copy file for checking if sysadmins have otp set
|
|
||||||
template:
|
|
||||||
src: check_sysadmin_otp.py.j2
|
|
||||||
dest: /root/check_sysadmin_otp.py
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
tags:
|
|
||||||
- ipa/server
|
|
||||||
- otp_script
|
|
||||||
|
|
76
roles/ipa/server/tasks/scripts.yml
Normal file
76
roles/ipa/server/tasks/scripts.yml
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
- name: install needed packages for scripts
|
||||||
|
package:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: present
|
||||||
|
with_items:
|
||||||
|
- python3-freeipa
|
||||||
|
- python3-requests-gssapi
|
||||||
|
tags:
|
||||||
|
- ipa/server
|
||||||
|
- packages
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Cleanup stage users
|
||||||
|
#
|
||||||
|
- name: Create script user to cleanup stage users
|
||||||
|
ipauser:
|
||||||
|
name: sys-cleanup-stage-users
|
||||||
|
givenname: Cleanup stage users
|
||||||
|
sn: Script
|
||||||
|
userclass: system
|
||||||
|
ipaadmin_password: "{{ ipa_admin_password }}"
|
||||||
|
tags:
|
||||||
|
- ipa/server
|
||||||
|
- config
|
||||||
|
|
||||||
|
|
||||||
|
- name: Create the Stage User Administrator role
|
||||||
|
ipa_role:
|
||||||
|
name: "Stage User Administrator"
|
||||||
|
description: "Role for users that need to perform admin tasks on stage users."
|
||||||
|
privilege:
|
||||||
|
- "Stage User Administrators"
|
||||||
|
user:
|
||||||
|
- sys-cleanup-stage-users
|
||||||
|
ipa_host: "{{ inventory_hostname }}"
|
||||||
|
ipa_user: admin
|
||||||
|
ipa_pass: "{{ipa_admin_password}}"
|
||||||
|
validate_certs: no
|
||||||
|
tags:
|
||||||
|
- ipa/server
|
||||||
|
- config
|
||||||
|
|
||||||
|
|
||||||
|
- name: Get the keytab for the stage users cleanup script
|
||||||
|
include_role:
|
||||||
|
name: keytab/user
|
||||||
|
vars:
|
||||||
|
user: sys-cleanup-stage-users
|
||||||
|
tags:
|
||||||
|
- ipa/server
|
||||||
|
- config
|
||||||
|
|
||||||
|
|
||||||
|
- name: Deploy the stage users cleanup sript
|
||||||
|
copy:
|
||||||
|
src: cleanup-stage-users.py
|
||||||
|
dest: /etc/cron.daily/cleanup-stage-users
|
||||||
|
mode: 0755
|
||||||
|
tags:
|
||||||
|
- ipa/server
|
||||||
|
- config
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# OTP check for sysadmins
|
||||||
|
#
|
||||||
|
- name: Copy file for checking if sysadmins have otp set
|
||||||
|
template:
|
||||||
|
src: check_sysadmin_otp.py.j2
|
||||||
|
dest: /root/check_sysadmin_otp.py
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
tags:
|
||||||
|
- ipa/server
|
||||||
|
- otp_script
|
4
roles/keytab/user/defaults/main.yml
Normal file
4
roles/keytab/user/defaults/main.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
owner_user: root
|
||||||
|
owner_group: root
|
||||||
|
host: "{{inventory_hostname }}"
|
||||||
|
kt_location: "/etc/krb5.{{user}}.keytab"
|
67
roles/keytab/user/tasks/main.yml
Normal file
67
roles/keytab/user/tasks/main.yml
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
---
|
||||||
|
- name: Determine whether we need to get keytab
|
||||||
|
stat: path={{kt_location}}
|
||||||
|
register: keytab_status
|
||||||
|
check_mode: no
|
||||||
|
changed_when: "1 != 1"
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
|
||||||
|
- name: Get admin ticket
|
||||||
|
delegate_to: "{{ ipa_server }}"
|
||||||
|
shell: echo "{{ipa_admin_password}}" | kinit admin
|
||||||
|
check_mode: no
|
||||||
|
changed_when: "1 != 1"
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
when: not keytab_status.stat.exists
|
||||||
|
|
||||||
|
- name: Retrieve keytab
|
||||||
|
delegate_to: "{{ ipa_server }}"
|
||||||
|
command: ipa-getkeytab --retrieve --server {{ipa_server}} --keytab {{kt_location}} --principal {{user}}
|
||||||
|
register: retrieve_result
|
||||||
|
check_mode: no
|
||||||
|
changed_when: "1 != 1"
|
||||||
|
failed_when: "not ('Keytab successfully retrieved' in retrieve_result.stderr or 'krbPrincipalKey not found' in retrieve_result.stderr)"
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
when: not keytab_status.stat.exists
|
||||||
|
|
||||||
|
- name: Create keytab if it did not exist
|
||||||
|
delegate_to: "{{ ipa_server }}"
|
||||||
|
command: ipa-getkeytab --server {{ipa_server}} --keytab {{kt_location}} --principal {{user}}
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
when: not keytab_status.stat.exists and 'krbPrincipalKey not found' in retrieve_result.stderr
|
||||||
|
|
||||||
|
- name: Destroy admin ticket
|
||||||
|
delegate_to: "{{ ipa_server }}"
|
||||||
|
command: kdestroy -A
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
when: not keytab_status.stat.exists
|
||||||
|
|
||||||
|
- name: Set keytab permissions
|
||||||
|
file: path={{kt_location}} owner={{owner_user}} group={{owner_group}} mode=0640 state=file
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
|
||||||
|
- name: Set keytab ACL
|
||||||
|
acl: name={{kt_location}} entity={{extra_acl_user}} etype=user permissions=r state=present
|
||||||
|
tags:
|
||||||
|
- keytab
|
||||||
|
- config
|
||||||
|
- krb5
|
||||||
|
when: extra_acl_user is defined
|
Loading…
Add table
Add a link
Reference in a new issue