1 1.1 mrg #!/bin/sh 2 1.1 mrg # 3 1.6 mrg # $NetBSD: creds_msdos,v 1.6 2024/01/29 05:46:55 mrg Exp $ 4 1.1 mrg # 5 1.1 mrg # Copyright (c) 2019 Matthew R. Green 6 1.1 mrg # All rights reserved. 7 1.1 mrg # 8 1.1 mrg # Redistribution and use in source and binary forms, with or without 9 1.1 mrg # modification, are permitted provided that the following conditions 10 1.1 mrg # are met: 11 1.1 mrg # 1. Redistributions of source code must retain the above copyright 12 1.1 mrg # notice, this list of conditions and the following disclaimer. 13 1.1 mrg # 2. Redistributions in binary form must reproduce the above copyright 14 1.1 mrg # notice, this list of conditions and the following disclaimer in the 15 1.1 mrg # documentation and/or other materials provided with the distribution. 16 1.1 mrg # 17 1.1 mrg # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 1.1 mrg # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 1.1 mrg # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 1.1 mrg # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 1.1 mrg # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 22 1.1 mrg # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 1.1 mrg # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 24 1.1 mrg # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 1.1 mrg # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 mrg # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 mrg # SUCH DAMAGE. 28 1.1 mrg 29 1.1 mrg # 30 1.1 mrg # If "creds_msdos_partition" is an msdos partition and has a creds.txt 31 1.1 mrg # in it, perform these commands: 32 1.1 mrg # "sshkeyfile <user> <path on msdos>" 33 1.1 mrg # "sshkey <user> <entry>" 34 1.1 mrg # "useraddhash <user> <passwd hash>" 35 1.1 mrg # "useradd <user> <passwd>" 36 1.1 mrg # If the "useradd" method is used, this the creds.txt file will be 37 1.1 mrg # shredded and deleted with rm -P. 38 1.1 mrg 39 1.1 mrg # PROVIDE: creds_msdos 40 1.1 mrg # REQUIRE: mountall 41 1.1 mrg 42 1.1 mrg $_rc_subr_loaded . /etc/rc.subr 43 1.1 mrg 44 1.1 mrg name="creds_msdos" 45 1.1 mrg start_cmd="creds_msdos_start" 46 1.1 mrg stop_cmd=":" 47 1.1 mrg 48 1.1 mrg fail() { 49 1.1 mrg echo "$@" 1>&2 50 1.1 mrg exit 1 51 1.1 mrg } 52 1.1 mrg 53 1.3 mrg # This uses $ssh_userkeys global 54 1.1 mrg sshkey_setup() { 55 1.1 mrg local user="$1" 56 1.1 mrg local group="wheel" 57 1.1 mrg 58 1.1 mrg # don't create existing users 59 1.3 mrg if ! id -u "${user}" > /dev/null 2>&1; then 60 1.3 mrg useradd -m -G "${group}" "${user}" || fail "Useradd failed." 61 1.1 mrg fi 62 1.1 mrg 63 1.3 mrg eval ssh_userdir=~"${user}/.ssh" 64 1.3 mrg mkdir -p -m 755 "${ssh_userdir}" || fail "mkdir ~/.ssh failed." 65 1.3 mrg chmod 755 "${ssh_userdir}" 66 1.3 mrg chown "${user}" "${ssh_userdir}" 67 1.3 mrg 68 1.3 mrg ssh_userkeys="${ssh_userdir}/authorized_keys" 69 1.1 mrg } 70 1.1 mrg 71 1.1 mrg sshkey_finish() { 72 1.1 mrg local user="$1" 73 1.1 mrg 74 1.3 mrg chmod 644 "${ssh_userkeys}" 75 1.3 mrg chown "${user}" "${ssh_userkeys}" 76 1.1 mrg } 77 1.1 mrg 78 1.1 mrg do_sshkeyfile() { 79 1.1 mrg local user="$1" 80 1.1 mrg local newkeys="${creds_msdos_partition}/$2" 81 1.1 mrg 82 1.1 mrg if [ ! -f "${newkeys}" ]; then 83 1.1 mrg return 84 1.1 mrg fi 85 1.1 mrg 86 1.3 mrg sshkey_setup "${user}" 87 1.1 mrg 88 1.1 mrg # check entry is not present 89 1.1 mrg while read type keydata name; do 90 1.3 mrg if fgrep -q "${keydata}" "${ssh_userkeys}" 2>/dev/null; then 91 1.1 mrg continue 92 1.1 mrg fi 93 1.3 mrg echo "${type} ${keydata} ${name}" >> "${ssh_userkeys}" 94 1.1 mrg done < "${newkeys}" 95 1.1 mrg 96 1.3 mrg sshkey_finish "${user}" 97 1.1 mrg } 98 1.1 mrg 99 1.1 mrg do_sshkey() { 100 1.1 mrg local user="$1" 101 1.1 mrg local newkey="$2" 102 1.1 mrg 103 1.3 mrg sshkey_setup "${user}" 104 1.1 mrg 105 1.3 mrg echo "${newkey}" >> "${ssh_userkeys}" 106 1.1 mrg 107 1.3 mrg sshkey_finish "${user}" 108 1.1 mrg } 109 1.1 mrg 110 1.1 mrg do_useraddpwhash() { 111 1.1 mrg local user="$1" 112 1.1 mrg local pwhash="$2" 113 1.1 mrg local group="wheel" 114 1.1 mrg 115 1.1 mrg # don't add to existing users 116 1.3 mrg if id -u "${user}" > /dev/null 2>&1; then 117 1.1 mrg return 118 1.1 mrg fi 119 1.1 mrg 120 1.1 mrg useradd -m -p "${pwhash}" -G "${group}" "${user}" || fail "Useradd failed." 121 1.1 mrg } 122 1.1 mrg 123 1.1 mrg do_useradd() { 124 1.1 mrg local user="$1" 125 1.1 mrg local password="$2" 126 1.1 mrg 127 1.1 mrg local pwhash=$(pwhash "$password") 128 1.1 mrg do_useraddpwhash "${user}" "${pwhash}" 129 1.1 mrg } 130 1.1 mrg 131 1.1 mrg creds_msdos_start() 132 1.1 mrg { 133 1.3 mrg local fstab_file=/etc/fstab 134 1.3 mrg 135 1.1 mrg if [ -z "${creds_msdos_partition}" ]; then 136 1.4 mlelstv echo "Not looking for credentials on msdos" 137 1.3 mrg return 138 1.1 mrg fi 139 1.1 mrg while read junk1 mp fstype junk2; do 140 1.1 mrg if [ "${mp}" != "${creds_msdos_partition}" ]; then 141 1.1 mrg continue 142 1.1 mrg fi 143 1.1 mrg if [ "${fstype}" != "msdos" ]; then 144 1.1 mrg echo "Not checking for creds on ${creds_msdos_partition}: not an msdos file system" 145 1.3 mrg return 146 1.1 mrg fi 147 1.1 mrg break 148 1.1 mrg done < "${fstab_file}" 149 1.1 mrg 150 1.3 mrg local delete_creds=no 151 1.3 mrg local creds_file="${creds_msdos_partition}/creds.txt" 152 1.1 mrg 153 1.1 mrg if [ -f "${creds_file}" ]; then 154 1.3 mrg while read type user args; do 155 1.2 mrg # strip cr 156 1.6 mrg local clean_args="$(echo "$args" | tr -d '\015')" 157 1.1 mrg case "$type" in 158 1.1 mrg \#*|'') 159 1.1 mrg continue 160 1.1 mrg ;; 161 1.1 mrg sshkeyfile) 162 1.1 mrg echo "Added user ${user} via ssh key file method." 163 1.3 mrg do_sshkeyfile "${user}" "${clean_args}" 164 1.1 mrg ;; 165 1.1 mrg sshkey) 166 1.1 mrg echo "Added user ${user} via ssh key string method." 167 1.3 mrg do_sshkey "${user}" "${clean_args}" 168 1.1 mrg ;; 169 1.1 mrg useraddpwhash) 170 1.1 mrg echo "Added user ${user} via password hash method." 171 1.3 mrg do_useraddpwhash "${user}" "${clean_args}" 172 1.1 mrg ;; 173 1.1 mrg useradd) 174 1.1 mrg echo "Added user ${user} via password method, shredding credentials file." 175 1.3 mrg do_useradd "${user}" "${clean_args}" 176 1.1 mrg delete_creds=yes 177 1.1 mrg ;; 178 1.1 mrg *) 179 1.1 mrg echo "Do not understand '$type' creds" 1>&2 180 1.1 mrg exit 1 181 1.1 mrg ;; 182 1.1 mrg esac 183 1.1 mrg done < "${creds_file}" 184 1.1 mrg fi 185 1.1 mrg 186 1.1 mrg if [ $delete_creds = yes ]; then 187 1.1 mrg rm -P -f "${creds_file}" 188 1.1 mrg fi 189 1.1 mrg } 190 1.1 mrg 191 1.1 mrg load_rc_config $name 192 1.1 mrg run_rc_command "$1" 193