Skip to content

Commit e487b18

Browse files
authored
Merge pull request #177 from dokku/validate-on-list
feat: validate the authorized_keys file when running the list subcommand
2 parents 305e1e9 + 939d227 commit e487b18

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,23 @@ no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding
8282

8383
This can be useful for cases where the ssh server does not allow certain options or you
8484
wish to further constrain a user's environment. Please see `man sshd` for more information.
85+
86+
Existing keys can be listed via the `list` subcommand:
87+
88+
```shell
89+
# in text format
90+
sshcommand list cmd
91+
92+
# filter by a particular name
93+
sshcommand list cmd progrium
94+
95+
# in json format
96+
sshcommand list cmd "" json
97+
98+
# with name filtering
99+
sshcommand list cmd progrium json
100+
101+
# ignore validation errors (though they will be printed to stderr)
102+
export SSHCOMMAND_IGNORE_LIST_WARNINGS=true
103+
sshcommand list cmd
104+
```

sshcommand

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,50 @@ fn-adduser() {
8686
esac
8787
}
8888

89+
fn-verify-file() {
90+
declare desc="Test that public key is valid"
91+
declare file="$1"
92+
local has_errors=false
93+
94+
local key line=0
95+
local TMP_KEY_FILE
96+
TMP_KEY_FILE=$(mktemp "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")
97+
# shellcheck disable=SC2064
98+
trap "rm -rf '$TMP_KEY_FILE' >/dev/null" RETURN INT TERM EXIT
99+
100+
SSHCOMMAND_IGNORE_LIST_WARNINGS="${SSHCOMMAND_IGNORE_LIST_WARNINGS:-false}"
101+
while read -r key; do
102+
line=$((line + 1))
103+
[[ -z "$key" ]] && continue
104+
[[ "$key" =~ ^#.*$ ]] && continue
105+
106+
echo "$key" >"$TMP_KEY_FILE"
107+
if ! ssh-keygen -lf "$TMP_KEY_FILE" &>/dev/null; then
108+
has_errors=true
109+
if [[ "$SSHCOMMAND_IGNORE_LIST_WARNINGS" == "false" ]]; then
110+
log-warn "${file} line $line failed ssh-keygen check."
111+
else
112+
log-warn "${file} line $line failed ssh-keygen check, ignoring."
113+
fi
114+
fi
115+
done <"${file}"
116+
117+
if [[ "$has_errors" == "true" ]]; then
118+
return 1
119+
fi
120+
}
121+
89122
log-fail() {
90123
declare desc="Log fail formatter"
91124
echo "$@" 1>&2
92125
exit 1
93126
}
94127

128+
log-warn() {
129+
declare desc="Log warn formatter"
130+
echo "$@" 1>&2
131+
}
132+
95133
log-verbose() {
96134
declare desc="Log verbose formatter"
97135
if [[ -n "$SSHCOMMAND_VERBOSE_OUTPUT" ]]; then
@@ -209,6 +247,11 @@ sshcommand-list() {
209247
[[ -e "$userhome/.ssh/authorized_keys" ]] || log-fail "authorized_keys not found for $USER"
210248
[[ -s "$userhome/.ssh/authorized_keys" ]] || log-fail "authorized_keys is empty for $USER"
211249

250+
SSHCOMMAND_IGNORE_LIST_WARNINGS="${SSHCOMMAND_IGNORE_LIST_WARNINGS:-false}"
251+
if ! fn-verify-file "$userhome/.ssh/authorized_keys" && [[ "$SSHCOMMAND_IGNORE_LIST_WARNINGS" == "false" ]]; then
252+
return 1
253+
fi
254+
212255
if [[ -n "$OUTPUT_TYPE" ]] && [[ "$OUTPUT_TYPE" == "json" ]]; then
213256
data=$(sed --silent --regexp-extended \
214257
's/^command="FINGERPRINT=(\S+) NAME=(\\"|)(.*)\2 `.*",(\S+).*/{ "fingerprint": "\1", "name": "\3", "SSHCOMMAND_ALLOWED_KEYS": "\4" }/p' \

0 commit comments

Comments
 (0)