|
| 1 | +#!/bin/sh |
| 2 | +set -e |
| 3 | + |
| 4 | +. /usr/share/debconf/confmodule |
| 5 | + |
| 6 | +CONF_FILE="/etc/security/pam_llng.conf" |
| 7 | +BACKUP_DIR="/var/backups/libpam-llng" |
| 8 | +PAM_SSHD="/etc/pam.d/sshd" |
| 9 | +PAM_SUDO="/etc/pam.d/sudo" |
| 10 | + |
| 11 | +# Backup a PAM file if not already backed up |
| 12 | +backup_pam_file() { |
| 13 | + file="$1" |
| 14 | + name="$2" |
| 15 | + if [ -f "$file" ] && [ ! -f "$BACKUP_DIR/${name}.orig" ]; then |
| 16 | + mkdir -p "$BACKUP_DIR" |
| 17 | + cp -a "$file" "$BACKUP_DIR/${name}.orig" |
| 18 | + fi |
| 19 | +} |
| 20 | + |
| 21 | +# Generate PAM configuration for sshd |
| 22 | +generate_pam_sshd() { |
| 23 | + mode="$1" |
| 24 | + server_group="$2" |
| 25 | + cat << EOF |
| 26 | +# /etc/pam.d/sshd - Configured by libpam-llng |
| 27 | +# Mode: $mode |
| 28 | +# Server group: $server_group |
| 29 | +# |
| 30 | +EOF |
| 31 | + case "$mode" in |
| 32 | + mode-a) |
| 33 | + cat << EOF |
| 34 | +# AUTHENTICATION: Only LLNG tokens accepted |
| 35 | +auth sufficient pam_llng.so server_group=$server_group |
| 36 | +auth required pam_deny.so |
| 37 | +EOF |
| 38 | + ;; |
| 39 | + mode-b|mode-d) |
| 40 | + cat << EOF |
| 41 | +# AUTHENTICATION: LLNG token OR Unix password |
| 42 | +auth sufficient pam_llng.so server_group=$server_group |
| 43 | +auth sufficient pam_unix.so nullok try_first_pass |
| 44 | +auth required pam_deny.so |
| 45 | +EOF |
| 46 | + ;; |
| 47 | + mode-c) |
| 48 | + cat << 'EOF' |
| 49 | +# AUTHENTICATION: SSH keys only (handled by sshd, not PAM) |
| 50 | +auth required pam_permit.so |
| 51 | +EOF |
| 52 | + ;; |
| 53 | + esac |
| 54 | + cat << EOF |
| 55 | +
|
| 56 | +# AUTHORIZATION: LLNG checks if user can access this server |
| 57 | +account required pam_llng.so server_group=$server_group |
| 58 | +account required pam_unix.so |
| 59 | +
|
| 60 | +# SESSION |
| 61 | +session required pam_unix.so |
| 62 | +EOF |
| 63 | +} |
| 64 | + |
| 65 | +# Generate PAM configuration for sudo |
| 66 | +generate_pam_sudo() { |
| 67 | + mode="$1" |
| 68 | + server_group="$2" |
| 69 | + cat << EOF |
| 70 | +# /etc/pam.d/sudo - Configured by libpam-llng |
| 71 | +# Mode: $mode |
| 72 | +# Server group: $server_group |
| 73 | +# |
| 74 | +EOF |
| 75 | + case "$mode" in |
| 76 | + mode-a) |
| 77 | + cat << EOF |
| 78 | +# AUTHENTICATION: Only LLNG tokens accepted |
| 79 | +auth sufficient pam_llng.so server_group=$server_group |
| 80 | +auth required pam_deny.so |
| 81 | +EOF |
| 82 | + ;; |
| 83 | + mode-b|mode-d) |
| 84 | + cat << EOF |
| 85 | +# AUTHENTICATION: LLNG token OR Unix password |
| 86 | +auth sufficient pam_llng.so server_group=$server_group |
| 87 | +auth sufficient pam_unix.so nullok try_first_pass |
| 88 | +auth required pam_deny.so |
| 89 | +EOF |
| 90 | + ;; |
| 91 | + mode-c) |
| 92 | + cat << 'EOF' |
| 93 | +# AUTHENTICATION: Permit (for SSH key scenarios) |
| 94 | +auth required pam_permit.so |
| 95 | +EOF |
| 96 | + ;; |
| 97 | + esac |
| 98 | + cat << EOF |
| 99 | +
|
| 100 | +# AUTHORIZATION |
| 101 | +account required pam_llng.so server_group=$server_group |
| 102 | +account required pam_unix.so |
| 103 | +
|
| 104 | +# SESSION |
| 105 | +session required pam_unix.so |
| 106 | +EOF |
| 107 | +} |
| 108 | + |
| 109 | +# Generate pam_llng.conf |
| 110 | +generate_llng_conf() { |
| 111 | + portal_url="$1" |
| 112 | + client_id="$2" |
| 113 | + client_secret="$3" |
| 114 | + server_group="$4" |
| 115 | + |
| 116 | + cat << EOF |
| 117 | +# /etc/security/pam_llng.conf |
| 118 | +# Configured by libpam-llng debconf |
| 119 | +# Run 'dpkg-reconfigure libpam-llng' to modify |
| 120 | +
|
| 121 | +# LemonLDAP::NG portal URL |
| 122 | +portal_url = $portal_url |
| 123 | +
|
| 124 | +# OIDC client credentials |
| 125 | +client_id = $client_id |
| 126 | +client_secret = $client_secret |
| 127 | +
|
| 128 | +# Server authentication |
| 129 | +server_token_file = /etc/security/pam_llng.token |
| 130 | +server_group = $server_group |
| 131 | +
|
| 132 | +# HTTP settings |
| 133 | +timeout = 10 |
| 134 | +verify_ssl = true |
| 135 | +
|
| 136 | +# Cache settings |
| 137 | +cache_enabled = true |
| 138 | +cache_dir = /var/cache/pam_llng |
| 139 | +cache_ttl = 300 |
| 140 | +
|
| 141 | +# Logging: error, warn, info, debug |
| 142 | +log_level = warn |
| 143 | +EOF |
| 144 | +} |
| 145 | + |
| 146 | +case "$1" in |
| 147 | + configure) |
| 148 | + db_get libpam-llng/pam-mode |
| 149 | + MODE="$RET" |
| 150 | + |
| 151 | + if [ "$MODE" != "none" ] && [ -n "$MODE" ]; then |
| 152 | + # Get debconf values |
| 153 | + db_get libpam-llng/portal-url |
| 154 | + PORTAL_URL="$RET" |
| 155 | + db_get libpam-llng/client-id |
| 156 | + CLIENT_ID="$RET" |
| 157 | + db_get libpam-llng/client-secret |
| 158 | + CLIENT_SECRET="$RET" |
| 159 | + db_get libpam-llng/server-group |
| 160 | + SERVER_GROUP="$RET" |
| 161 | + db_get libpam-llng/configure-sudo |
| 162 | + CONFIGURE_SUDO="$RET" |
| 163 | + db_get libpam-llng/sudo-server-group |
| 164 | + SUDO_SERVER_GROUP="$RET" |
| 165 | + |
| 166 | + # Use main server group for sudo if not specified |
| 167 | + if [ -z "$SUDO_SERVER_GROUP" ]; then |
| 168 | + SUDO_SERVER_GROUP="$SERVER_GROUP" |
| 169 | + fi |
| 170 | + |
| 171 | + # Generate pam_llng.conf if portal URL is provided |
| 172 | + if [ -n "$PORTAL_URL" ]; then |
| 173 | + generate_llng_conf "$PORTAL_URL" "$CLIENT_ID" "$CLIENT_SECRET" "$SERVER_GROUP" > "$CONF_FILE" |
| 174 | + chmod 600 "$CONF_FILE" |
| 175 | + chown root:root "$CONF_FILE" |
| 176 | + fi |
| 177 | + |
| 178 | + # Backup and configure sshd |
| 179 | + backup_pam_file "$PAM_SSHD" "sshd" |
| 180 | + generate_pam_sshd "$MODE" "$SERVER_GROUP" > "$PAM_SSHD" |
| 181 | + |
| 182 | + # Configure sudo if requested |
| 183 | + if [ "$CONFIGURE_SUDO" = "true" ]; then |
| 184 | + backup_pam_file "$PAM_SUDO" "sudo" |
| 185 | + generate_pam_sudo "$MODE" "$SUDO_SERVER_GROUP" > "$PAM_SUDO" |
| 186 | + fi |
| 187 | + |
| 188 | + # Create cache directory |
| 189 | + mkdir -p /var/cache/pam_llng |
| 190 | + chmod 700 /var/cache/pam_llng |
| 191 | + |
| 192 | + # Clear secret from debconf database for security |
| 193 | + db_set libpam-llng/client-secret "" |
| 194 | + fi |
| 195 | + ;; |
| 196 | + |
| 197 | + abort-upgrade|abort-remove|abort-deconfigure) |
| 198 | + ;; |
| 199 | + |
| 200 | + *) |
| 201 | + echo "postinst called with unknown argument '$1'" >&2 |
| 202 | + exit 1 |
| 203 | + ;; |
| 204 | +esac |
| 205 | + |
| 206 | +#DEBHELPER# |
| 207 | + |
| 208 | +exit 0 |
0 commit comments