summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2019-11-25 00:54:23 +0000
committerDamien Miller <djm@mindrot.org>2019-11-25 12:23:40 +1100
commit2e71263b80fec7ad977e098004fef7d122169d40 (patch)
treeb4eef0768ef7fb69c0acdfad6a9d63762791d6f6
parent0fddf2967ac51d518e300408a0d7e6adf4cd2634 (diff)
upstream: add a "no-touch-required" option for authorized_keys and
a similar extension for certificates. This option disables the default requirement that security key signatures attest that the user touched their key to authorize them. feedback deraadt, ok markus OpenBSD-Commit-ID: f1fb56151ba68d55d554d0f6d3d4dba0cf1a452e
-rw-r--r--auth-options.c38
-rw-r--r--auth-options.h5
-rw-r--r--auth.c7
-rw-r--r--auth2-pubkey.c5
-rw-r--r--monitor.c5
-rw-r--r--ssh-keygen.112
-rw-r--r--ssh-keygen.c25
-rw-r--r--sshd.813
8 files changed, 78 insertions, 32 deletions
diff --git a/auth-options.c b/auth-options.c
index 90b0d7f25..2d200944c 100644
--- a/auth-options.c
+++ b/auth-options.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: auth-options.c,v 1.89 2019/09/13 04:36:43 dtucker Exp $ */ 1/* $OpenBSD: auth-options.c,v 1.90 2019/11/25 00:54:23 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Damien Miller <djm@mindrot.org> 3 * Copyright (c) 2018 Damien Miller <djm@mindrot.org>
4 * 4 *
@@ -96,7 +96,10 @@ cert_option_list(struct sshauthopt *opts, struct sshbuf *oblob,
96 name, sshbuf_len(data)); 96 name, sshbuf_len(data));
97 found = 0; 97 found = 0;
98 if ((which & OPTIONS_EXTENSIONS) != 0) { 98 if ((which & OPTIONS_EXTENSIONS) != 0) {
99 if (strcmp(name, "permit-X11-forwarding") == 0) { 99 if (strcmp(name, "no-touch-required") == 0) {
100 opts->no_require_user_presence = 1;
101 found = 1;
102 } else if (strcmp(name, "permit-X11-forwarding") == 0) {
100 opts->permit_x11_forwarding_flag = 1; 103 opts->permit_x11_forwarding_flag = 1;
101 found = 1; 104 found = 1;
102 } else if (strcmp(name, 105 } else if (strcmp(name,
@@ -347,6 +350,8 @@ sshauthopt_parse(const char *opts, const char **errstrp)
347 ret->permit_agent_forwarding_flag = r == 1; 350 ret->permit_agent_forwarding_flag = r == 1;
348 } else if ((r = opt_flag("x11-forwarding", 1, &opts)) != -1) { 351 } else if ((r = opt_flag("x11-forwarding", 1, &opts)) != -1) {
349 ret->permit_x11_forwarding_flag = r == 1; 352 ret->permit_x11_forwarding_flag = r == 1;
353 } else if ((r = opt_flag("touch-required", 1, &opts)) != -1) {
354 ret->no_require_user_presence = r != 1; /* NB. flip */
350 } else if ((r = opt_flag("pty", 1, &opts)) != -1) { 355 } else if ((r = opt_flag("pty", 1, &opts)) != -1) {
351 ret->permit_pty_flag = r == 1; 356 ret->permit_pty_flag = r == 1;
352 } else if ((r = opt_flag("user-rc", 1, &opts)) != -1) { 357 } else if ((r = opt_flag("user-rc", 1, &opts)) != -1) {
@@ -567,14 +572,15 @@ sshauthopt_merge(const struct sshauthopt *primary,
567 goto alloc_fail; 572 goto alloc_fail;
568 } 573 }
569 574
570 /* Flags are logical-AND (i.e. must be set in both for permission) */ 575#define OPTFLAG_AND(x) ret->x = (primary->x == 1) && (additional->x == 1)
571#define OPTFLAG(x) ret->x = (primary->x == 1) && (additional->x == 1) 576 /* Permissive flags are logical-AND (i.e. must be set in both) */
572 OPTFLAG(permit_port_forwarding_flag); 577 OPTFLAG_AND(permit_port_forwarding_flag);
573 OPTFLAG(permit_agent_forwarding_flag); 578 OPTFLAG_AND(permit_agent_forwarding_flag);
574 OPTFLAG(permit_x11_forwarding_flag); 579 OPTFLAG_AND(permit_x11_forwarding_flag);
575 OPTFLAG(permit_pty_flag); 580 OPTFLAG_AND(permit_pty_flag);
576 OPTFLAG(permit_user_rc); 581 OPTFLAG_AND(permit_user_rc);
577#undef OPTFLAG 582 OPTFLAG_AND(no_require_user_presence);
583#undef OPTFLAG_AND
578 584
579 /* Earliest expiry time should win */ 585 /* Earliest expiry time should win */
580 if (primary->valid_before != 0) 586 if (primary->valid_before != 0)
@@ -643,6 +649,7 @@ sshauthopt_copy(const struct sshauthopt *orig)
643 OPTSCALAR(cert_authority); 649 OPTSCALAR(cert_authority);
644 OPTSCALAR(force_tun_device); 650 OPTSCALAR(force_tun_device);
645 OPTSCALAR(valid_before); 651 OPTSCALAR(valid_before);
652 OPTSCALAR(no_require_user_presence);
646#undef OPTSCALAR 653#undef OPTSCALAR
647#define OPTSTRING(x) \ 654#define OPTSTRING(x) \
648 do { \ 655 do { \
@@ -765,7 +772,7 @@ sshauthopt_serialise(const struct sshauthopt *opts, struct sshbuf *m,
765{ 772{
766 int r = SSH_ERR_INTERNAL_ERROR; 773 int r = SSH_ERR_INTERNAL_ERROR;
767 774
768 /* Flag and simple integer options */ 775 /* Flag options */
769 if ((r = sshbuf_put_u8(m, opts->permit_port_forwarding_flag)) != 0 || 776 if ((r = sshbuf_put_u8(m, opts->permit_port_forwarding_flag)) != 0 ||
770 (r = sshbuf_put_u8(m, opts->permit_agent_forwarding_flag)) != 0 || 777 (r = sshbuf_put_u8(m, opts->permit_agent_forwarding_flag)) != 0 ||
771 (r = sshbuf_put_u8(m, opts->permit_x11_forwarding_flag)) != 0 || 778 (r = sshbuf_put_u8(m, opts->permit_x11_forwarding_flag)) != 0 ||
@@ -773,7 +780,11 @@ sshauthopt_serialise(const struct sshauthopt *opts, struct sshbuf *m,
773 (r = sshbuf_put_u8(m, opts->permit_user_rc)) != 0 || 780 (r = sshbuf_put_u8(m, opts->permit_user_rc)) != 0 ||
774 (r = sshbuf_put_u8(m, opts->restricted)) != 0 || 781 (r = sshbuf_put_u8(m, opts->restricted)) != 0 ||
775 (r = sshbuf_put_u8(m, opts->cert_authority)) != 0 || 782 (r = sshbuf_put_u8(m, opts->cert_authority)) != 0 ||
776 (r = sshbuf_put_u64(m, opts->valid_before)) != 0) 783 (r = sshbuf_put_u8(m, opts->no_require_user_presence)) != 0)
784 return r;
785
786 /* Simple integer options */
787 if ((r = sshbuf_put_u64(m, opts->valid_before)) != 0)
777 return r; 788 return r;
778 789
779 /* tunnel number can be negative to indicate "unset" */ 790 /* tunnel number can be negative to indicate "unset" */
@@ -817,6 +828,7 @@ sshauthopt_deserialise(struct sshbuf *m, struct sshauthopt **optsp)
817 if ((opts = calloc(1, sizeof(*opts))) == NULL) 828 if ((opts = calloc(1, sizeof(*opts))) == NULL)
818 return SSH_ERR_ALLOC_FAIL; 829 return SSH_ERR_ALLOC_FAIL;
819 830
831 /* Flag options */
820#define OPT_FLAG(x) \ 832#define OPT_FLAG(x) \
821 do { \ 833 do { \
822 if ((r = sshbuf_get_u8(m, &f)) != 0) \ 834 if ((r = sshbuf_get_u8(m, &f)) != 0) \
@@ -830,8 +842,10 @@ sshauthopt_deserialise(struct sshbuf *m, struct sshauthopt **optsp)
830 OPT_FLAG(permit_user_rc); 842 OPT_FLAG(permit_user_rc);
831 OPT_FLAG(restricted); 843 OPT_FLAG(restricted);
832 OPT_FLAG(cert_authority); 844 OPT_FLAG(cert_authority);
845 OPT_FLAG(no_require_user_presence);
833#undef OPT_FLAG 846#undef OPT_FLAG
834 847
848 /* Simple integer options */
835 if ((r = sshbuf_get_u64(m, &opts->valid_before)) != 0) 849 if ((r = sshbuf_get_u64(m, &opts->valid_before)) != 0)
836 goto out; 850 goto out;
837 851
diff --git a/auth-options.h b/auth-options.h
index 14cbfa49d..d96ffedee 100644
--- a/auth-options.h
+++ b/auth-options.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: auth-options.h,v 1.28 2019/07/09 04:15:00 djm Exp $ */ 1/* $OpenBSD: auth-options.h,v 1.29 2019/11/25 00:54:23 djm Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2018 Damien Miller <djm@mindrot.org> 4 * Copyright (c) 2018 Damien Miller <djm@mindrot.org>
@@ -68,6 +68,9 @@ struct sshauthopt {
68 */ 68 */
69 char *required_from_host_cert; 69 char *required_from_host_cert;
70 char *required_from_host_keys; 70 char *required_from_host_keys;
71
72 /* Key requires user presence asserted */
73 int no_require_user_presence;
71}; 74};
72 75
73struct sshauthopt *sshauthopt_new(void); 76struct sshauthopt *sshauthopt_new(void);
diff --git a/auth.c b/auth.c
index b092f212c..0a46e1d8a 100644
--- a/auth.c
+++ b/auth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: auth.c,v 1.142 2019/10/16 06:05:39 djm Exp $ */ 1/* $OpenBSD: auth.c,v 1.143 2019/11/25 00:54:23 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2000 Markus Friedl. All rights reserved. 3 * Copyright (c) 2000 Markus Friedl. All rights reserved.
4 * 4 *
@@ -1005,7 +1005,7 @@ auth_log_authopts(const char *loc, const struct sshauthopt *opts, int do_remote)
1005 1005
1006 snprintf(buf, sizeof(buf), "%d", opts->force_tun_device); 1006 snprintf(buf, sizeof(buf), "%d", opts->force_tun_device);
1007 /* Try to keep this alphabetically sorted */ 1007 /* Try to keep this alphabetically sorted */
1008 snprintf(msg, sizeof(msg), "key options:%s%s%s%s%s%s%s%s%s%s%s%s%s", 1008 snprintf(msg, sizeof(msg), "key options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
1009 opts->permit_agent_forwarding_flag ? " agent-forwarding" : "", 1009 opts->permit_agent_forwarding_flag ? " agent-forwarding" : "",
1010 opts->force_command == NULL ? "" : " command", 1010 opts->force_command == NULL ? "" : " command",
1011 do_env ? " environment" : "", 1011 do_env ? " environment" : "",
@@ -1018,7 +1018,8 @@ auth_log_authopts(const char *loc, const struct sshauthopt *opts, int do_remote)
1018 opts->force_tun_device == -1 ? "" : " tun=", 1018 opts->force_tun_device == -1 ? "" : " tun=",
1019 opts->force_tun_device == -1 ? "" : buf, 1019 opts->force_tun_device == -1 ? "" : buf,
1020 opts->permit_user_rc ? " user-rc" : "", 1020 opts->permit_user_rc ? " user-rc" : "",
1021 opts->permit_x11_forwarding_flag ? " x11-forwarding" : ""); 1021 opts->permit_x11_forwarding_flag ? " x11-forwarding" : "",
1022 opts->no_require_user_presence ? " no-touch-required" : "");
1022 1023
1023 debug("%s: %s", loc, msg); 1024 debug("%s: %s", loc, msg);
1024 if (do_remote) 1025 if (do_remote)
diff --git a/auth2-pubkey.c b/auth2-pubkey.c
index 0ef982a48..b656b1f8c 100644
--- a/auth2-pubkey.c
+++ b/auth2-pubkey.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: auth2-pubkey.c,v 1.96 2019/11/25 00:52:46 djm Exp $ */ 1/* $OpenBSD: auth2-pubkey.c,v 1.97 2019/11/25 00:54:23 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2000 Markus Friedl. All rights reserved. 3 * Copyright (c) 2000 Markus Friedl. All rights reserved.
4 * 4 *
@@ -225,7 +225,8 @@ userauth_pubkey(struct ssh *ssh)
225 __func__, sig_details->sk_counter, 225 __func__, sig_details->sk_counter,
226 sig_details->sk_flags); 226 sig_details->sk_flags);
227 req_presence = (options.pubkey_auth_options & 227 req_presence = (options.pubkey_auth_options &
228 PUBKEYAUTH_TOUCH_REQUIRED); 228 PUBKEYAUTH_TOUCH_REQUIRED) ||
229 !authopts->no_require_user_presence;
229 if (req_presence && (sig_details->sk_flags & 230 if (req_presence && (sig_details->sk_flags &
230 SSH_SK_USER_PRESENCE_REQD) == 0) { 231 SSH_SK_USER_PRESENCE_REQD) == 0) {
231 error("public key %s signature for %s%s from " 232 error("public key %s signature for %s%s from "
diff --git a/monitor.c b/monitor.c
index 9b171c447..d4be7409e 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: monitor.c,v 1.203 2019/11/25 00:52:46 djm Exp $ */ 1/* $OpenBSD: monitor.c,v 1.204 2019/11/25 00:54:23 djm Exp $ */
2/* 2/*
3 * Copyright 2002 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2002 Niels Provos <provos@citi.umich.edu>
4 * Copyright 2002 Markus Friedl <markus@openbsd.org> 4 * Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -1440,7 +1440,8 @@ mm_answer_keyverify(struct ssh *ssh, int sock, struct sshbuf *m)
1440 1440
1441 if (ret == 0 && key_blobtype == MM_USERKEY && sig_details != NULL) { 1441 if (ret == 0 && key_blobtype == MM_USERKEY && sig_details != NULL) {
1442 req_presence = (options.pubkey_auth_options & 1442 req_presence = (options.pubkey_auth_options &
1443 PUBKEYAUTH_TOUCH_REQUIRED); 1443 PUBKEYAUTH_TOUCH_REQUIRED) ||
1444 !key_opts->no_require_user_presence;
1444 if (req_presence && 1445 if (req_presence &&
1445 (sig_details->sk_flags & SSH_SK_USER_PRESENCE_REQD) == 0) { 1446 (sig_details->sk_flags & SSH_SK_USER_PRESENCE_REQD) == 0) {
1446 error("public key %s %s signature for %s%s from %.128s " 1447 error("public key %s %s signature for %s%s from %.128s "
diff --git a/ssh-keygen.1 b/ssh-keygen.1
index feaa69efe..06aead348 100644
--- a/ssh-keygen.1
+++ b/ssh-keygen.1
@@ -1,4 +1,4 @@
1.\" $OpenBSD: ssh-keygen.1,v 1.176 2019/11/18 23:16:49 naddy Exp $ 1.\" $OpenBSD: ssh-keygen.1,v 1.177 2019/11/25 00:54:23 djm Exp $
2.\" 2.\"
3.\" Author: Tatu Ylonen <ylo@cs.hut.fi> 3.\" Author: Tatu Ylonen <ylo@cs.hut.fi>
4.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4.\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -35,7 +35,7 @@
35.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 35.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
36.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37.\" 37.\"
38.Dd $Mdocdate: November 18 2019 $ 38.Dd $Mdocdate: November 25 2019 $
39.Dt SSH-KEYGEN 1 39.Dt SSH-KEYGEN 1
40.Os 40.Os
41.Sh NAME 41.Sh NAME
@@ -534,6 +534,14 @@ by
534.It Ic permit-X11-forwarding 534.It Ic permit-X11-forwarding
535Allows X11 forwarding. 535Allows X11 forwarding.
536.Pp 536.Pp
537.It Ic no-touch-required
538Do not require signatures made using this key require demonstration
539of user presence (e.g. by having the user touch the key).
540This option only makes sense for the Security Key algorithms
541.Cm ecdsa-sk
542and
543.Cm ed25519-sk .
544.Pp
537.It Ic source-address Ns = Ns Ar address_list 545.It Ic source-address Ns = Ns Ar address_list
538Restrict the source addresses from which the certificate is considered valid. 546Restrict the source addresses from which the certificate is considered valid.
539The 547The
diff --git a/ssh-keygen.c b/ssh-keygen.c
index 08dd7cb8a..16d196fc8 100644
--- a/ssh-keygen.c
+++ b/ssh-keygen.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssh-keygen.c,v 1.370 2019/11/25 00:51:37 djm Exp $ */ 1/* $OpenBSD: ssh-keygen.c,v 1.371 2019/11/25 00:54:23 djm Exp $ */
2/* 2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi> 3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4 * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -120,11 +120,12 @@ static u_int64_t cert_valid_from = 0;
120static u_int64_t cert_valid_to = ~0ULL; 120static u_int64_t cert_valid_to = ~0ULL;
121 121
122/* Certificate options */ 122/* Certificate options */
123#define CERTOPT_X_FWD (1) 123#define CERTOPT_X_FWD (1)
124#define CERTOPT_AGENT_FWD (1<<1) 124#define CERTOPT_AGENT_FWD (1<<1)
125#define CERTOPT_PORT_FWD (1<<2) 125#define CERTOPT_PORT_FWD (1<<2)
126#define CERTOPT_PTY (1<<3) 126#define CERTOPT_PTY (1<<3)
127#define CERTOPT_USER_RC (1<<4) 127#define CERTOPT_USER_RC (1<<4)
128#define CERTOPT_NO_REQUIRE_USER_PRESENCE (1<<5)
128#define CERTOPT_DEFAULT (CERTOPT_X_FWD|CERTOPT_AGENT_FWD| \ 129#define CERTOPT_DEFAULT (CERTOPT_X_FWD|CERTOPT_AGENT_FWD| \
129 CERTOPT_PORT_FWD|CERTOPT_PTY|CERTOPT_USER_RC) 130 CERTOPT_PORT_FWD|CERTOPT_PTY|CERTOPT_USER_RC)
130static u_int32_t certflags_flags = CERTOPT_DEFAULT; 131static u_int32_t certflags_flags = CERTOPT_DEFAULT;
@@ -1666,6 +1667,9 @@ prepare_options_buf(struct sshbuf *c, int which)
1666 (certflags_flags & CERTOPT_USER_RC) != 0) 1667 (certflags_flags & CERTOPT_USER_RC) != 0)
1667 add_flag_option(c, "permit-user-rc"); 1668 add_flag_option(c, "permit-user-rc");
1668 if ((which & OPTIONS_CRITICAL) != 0 && 1669 if ((which & OPTIONS_CRITICAL) != 0 &&
1670 (certflags_flags & CERTOPT_NO_REQUIRE_USER_PRESENCE) != 0)
1671 add_flag_option(c, "no-touch-required");
1672 if ((which & OPTIONS_CRITICAL) != 0 &&
1669 certflags_src_addr != NULL) 1673 certflags_src_addr != NULL)
1670 add_string_option(c, "source-address", certflags_src_addr); 1674 add_string_option(c, "source-address", certflags_src_addr);
1671 for (i = 0; i < ncert_userext; i++) { 1675 for (i = 0; i < ncert_userext; i++) {
@@ -1967,6 +1971,10 @@ add_cert_option(char *opt)
1967 certflags_flags &= ~CERTOPT_USER_RC; 1971 certflags_flags &= ~CERTOPT_USER_RC;
1968 else if (strcasecmp(opt, "permit-user-rc") == 0) 1972 else if (strcasecmp(opt, "permit-user-rc") == 0)
1969 certflags_flags |= CERTOPT_USER_RC; 1973 certflags_flags |= CERTOPT_USER_RC;
1974 else if (strcasecmp(opt, "touch-required") == 0)
1975 certflags_flags &= ~CERTOPT_NO_REQUIRE_USER_PRESENCE;
1976 else if (strcasecmp(opt, "no-touch-required") == 0)
1977 certflags_flags |= CERTOPT_NO_REQUIRE_USER_PRESENCE;
1970 else if (strncasecmp(opt, "force-command=", 14) == 0) { 1978 else if (strncasecmp(opt, "force-command=", 14) == 0) {
1971 val = opt + 14; 1979 val = opt + 14;
1972 if (*val == '\0') 1980 if (*val == '\0')
@@ -2020,9 +2028,10 @@ show_options(struct sshbuf *optbuf, int in_critical)
2020 strcmp(name, "permit-agent-forwarding") == 0 || 2028 strcmp(name, "permit-agent-forwarding") == 0 ||
2021 strcmp(name, "permit-port-forwarding") == 0 || 2029 strcmp(name, "permit-port-forwarding") == 0 ||
2022 strcmp(name, "permit-pty") == 0 || 2030 strcmp(name, "permit-pty") == 0 ||
2023 strcmp(name, "permit-user-rc") == 0)) 2031 strcmp(name, "permit-user-rc") == 0 ||
2032 strcmp(name, "no-touch-required") == 0)) {
2024 printf("\n"); 2033 printf("\n");
2025 else if (in_critical && 2034 } else if (in_critical &&
2026 (strcmp(name, "force-command") == 0 || 2035 (strcmp(name, "force-command") == 0 ||
2027 strcmp(name, "source-address") == 0)) { 2036 strcmp(name, "source-address") == 0)) {
2028 if ((r = sshbuf_get_cstring(option, &arg, NULL)) != 0) 2037 if ((r = sshbuf_get_cstring(option, &arg, NULL)) != 0)
diff --git a/sshd.8 b/sshd.8
index 042610a03..b32da282f 100644
--- a/sshd.8
+++ b/sshd.8
@@ -33,8 +33,8 @@
33.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35.\" 35.\"
36.\" $OpenBSD: sshd.8,v 1.306 2019/11/18 04:55:02 djm Exp $ 36.\" $OpenBSD: sshd.8,v 1.307 2019/11/25 00:54:23 djm Exp $
37.Dd $Mdocdate: November 18 2019 $ 37.Dd $Mdocdate: November 25 2019 $
38.Dt SSHD 8 38.Dt SSHD 8
39.Os 39.Os
40.Sh NAME 40.Sh NAME
@@ -627,6 +627,13 @@ option.
627Permits tty allocation previously disabled by the 627Permits tty allocation previously disabled by the
628.Cm restrict 628.Cm restrict
629option. 629option.
630.It Cm no-touch-required
631Do not require demonstration of user presence
632for signatures made using this key.
633This option only makes sense for the Security Key algorithms
634.Cm ecdsa-sk
635and
636.Cm ed25519-sk .
630.It Cm restrict 637.It Cm restrict
631Enable all restrictions, i.e. disable port, agent and X11 forwarding, 638Enable all restrictions, i.e. disable port, agent and X11 forwarding,
632as well as disabling PTY allocation 639as well as disabling PTY allocation
@@ -670,6 +677,8 @@ restrict,command="uptime" ssh-rsa AAAA1C8...32Tv==
670user@example.net 677user@example.net
671restrict,pty,command="nethack" ssh-rsa AAAA1f8...IrrC5== 678restrict,pty,command="nethack" ssh-rsa AAAA1f8...IrrC5==
672user@example.net 679user@example.net
680no-touch-required sk-ecdsa-sha2-nistp256@openssh.com AAAAInN...Ko==
681user@example.net
673.Ed 682.Ed
674.Sh SSH_KNOWN_HOSTS FILE FORMAT 683.Sh SSH_KNOWN_HOSTS FILE FORMAT
675The 684The