aboutsummaryrefslogtreecommitdiffstats
path: root/modules/openssh/templates/ldap-sshkey2file.py
blob: ec7f7c7fae6b36cccc87785c530bff4ecad947ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/python

import sys
import os
import random
import shutil

try:
    import ldap
except ImportError, e:
    print "Please install python-ldap before running this program"
    sys.exit(1)

basedn="<%= dc_suffix %>"
peopledn="ou=people,%s" % basedn
<%-
  ldap_servers.map! { |l| "'ldaps://#{l}'" }
-%>
uris=[<%= ldap_servers.join(", ") %>]
# Temporoary hack because ldap-slave-1 is out of sync... no idea how to resync it :(
# Ask me about it or look at results from:
# ldapsearch -H ldaps://ldap-slave-1.mageia.org -D uid=$USER,ou=People,dc=mageia,dc=org -W -b uid=blue_prawn,ou=People,dc=mageia,dc=org
# vs
# ldapsearch -H ldaps://ldap-master.mageia.org -D uid=$USER,ou=People,dc=mageia,dc=org -W -b uid=blue_prawn,ou=People,dc=mageia,dc=org
uris=['ldaps://ldap-master.mageia.org']
random.shuffle(uris)
uri = " ".join(uris)
timeout=5
binddn="cn=<%= fqdn %>,ou=Hosts,%s" % basedn
pwfile="<%= ldap_pwfile %>"
# filter out disabled accounts also
# too bad uidNumber doesn't support >= filters
filter="(&(objectClass=inetOrgPerson)(objectClass=ldapPublicKey)(objectClass=posixAccount)(sshPublicKey=*))"
keypathprefix='/home'

def usage():
    print "%s" % sys.argv[0]
    print
    print "Will fetch all enabled user accounts under %s" % peopledn
    print "with ssh keys in them and write each one to"
    print "%s/<login>/authorized_keys" % keypathprefix
    print
    print "This script is intented to be run from cron as root"
    print

def get_pw(pwfile):
    try:
        f = open(pwfile, 'r')
    except IOError, e:
        print "Error while reading password file, aborting"
        print e
        sys.exit(1)
    pw = f.readline().strip()
    f.close()
    return pw

def write_keys(keys, user, uid, gid):
    if not os.path.isdir("%s/%s" % (keypathprefix,user)):
       shutil.copytree('/etc/skel', "%s/%s" % (keypathprefix,user))
       os.chown("%s/%s" % (keypathprefix,user), uid, gid)
       for root, dirs, files in os.walk("%s/%s" % (keypathprefix,user)):
           for d in dirs:
               os.chown(os.path.join(root, d), uid, gid)
           for f in files:
               os.chown(os.path.join(root, f), uid, gid)
    try:
        os.makedirs("%s/%s/.ssh" % (keypathprefix,user), 0700)
    except:
        pass
    keyfile = "%s/%s/.ssh/authorized_keys" % (keypathprefix,user)
    f = open(keyfile, 'w')
    for key in keys:
        f.write(key.strip() + "\n")
    f.close()
    os.chmod(keyfile, 0600)
    os.chown(keyfile, uid, gid)
    os.chmod("%s/%s/.ssh" % (keypathprefix,user), 0700)
    os.chown("%s/%s/.ssh" % (keypathprefix,user), uid, gid)

if len(sys.argv) != 1:
    usage()
    sys.exit(1)

bindpw = get_pw(pwfile)

try:
    ld = ldap.initialize(uri)
    ld.set_option(ldap.OPT_NETWORK_TIMEOUT, timeout)
    if uri.startswith("ldap:/"):
        ld.start_tls_s()
    ld.bind_s(binddn, bindpw)
    res = ld.search_s(peopledn, ldap.SCOPE_ONELEVEL, filter, ['uid','sshPublicKey','uidNumber','gidNumber'])
    try:
        os.makedirs(keypathprefix, 0701)
    except:
        pass
    for result in res:
        dn, entry = result
        # skip possible system users
        if int(entry['uidNumber'][0]) < 500:
            continue
        write_keys(entry['sshPublicKey'], entry['uid'][0], int(entry['uidNumber'][0]), int(entry['gidNumber'][0]))
    ld.unbind_s()
except Exception, e:
    print "Error"
    raise

sys.exit(0)


# vim:ts=4:sw=4:et:ai:si