diff options
author | djm@openbsd.org <djm@openbsd.org> | 2019-11-25 00:54:23 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2019-11-25 12:23:40 +1100 |
commit | 2e71263b80fec7ad977e098004fef7d122169d40 (patch) | |
tree | b4eef0768ef7fb69c0acdfad6a9d63762791d6f6 | |
parent | 0fddf2967ac51d518e300408a0d7e6adf4cd2634 (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.c | 38 | ||||
-rw-r--r-- | auth-options.h | 5 | ||||
-rw-r--r-- | auth.c | 7 | ||||
-rw-r--r-- | auth2-pubkey.c | 5 | ||||
-rw-r--r-- | monitor.c | 5 | ||||
-rw-r--r-- | ssh-keygen.1 | 12 | ||||
-rw-r--r-- | ssh-keygen.c | 25 | ||||
-rw-r--r-- | sshd.8 | 13 |
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 | ||
73 | struct sshauthopt *sshauthopt_new(void); | 76 | struct sshauthopt *sshauthopt_new(void); |
@@ -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 " |
@@ -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 |
535 | Allows X11 forwarding. | 535 | Allows X11 forwarding. |
536 | .Pp | 536 | .Pp |
537 | .It Ic no-touch-required | ||
538 | Do not require signatures made using this key require demonstration | ||
539 | of user presence (e.g. by having the user touch the key). | ||
540 | This option only makes sense for the Security Key algorithms | ||
541 | .Cm ecdsa-sk | ||
542 | and | ||
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 |
538 | Restrict the source addresses from which the certificate is considered valid. | 546 | Restrict the source addresses from which the certificate is considered valid. |
539 | The | 547 | The |
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; | |||
120 | static u_int64_t cert_valid_to = ~0ULL; | 120 | static 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) |
130 | static u_int32_t certflags_flags = CERTOPT_DEFAULT; | 131 | static 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) |
@@ -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. | |||
627 | Permits tty allocation previously disabled by the | 627 | Permits tty allocation previously disabled by the |
628 | .Cm restrict | 628 | .Cm restrict |
629 | option. | 629 | option. |
630 | .It Cm no-touch-required | ||
631 | Do not require demonstration of user presence | ||
632 | for signatures made using this key. | ||
633 | This option only makes sense for the Security Key algorithms | ||
634 | .Cm ecdsa-sk | ||
635 | and | ||
636 | .Cm ed25519-sk . | ||
630 | .It Cm restrict | 637 | .It Cm restrict |
631 | Enable all restrictions, i.e. disable port, agent and X11 forwarding, | 638 | Enable all restrictions, i.e. disable port, agent and X11 forwarding, |
632 | as well as disabling PTY allocation | 639 | as well as disabling PTY allocation |
@@ -670,6 +677,8 @@ restrict,command="uptime" ssh-rsa AAAA1C8...32Tv== | |||
670 | user@example.net | 677 | user@example.net |
671 | restrict,pty,command="nethack" ssh-rsa AAAA1f8...IrrC5== | 678 | restrict,pty,command="nethack" ssh-rsa AAAA1f8...IrrC5== |
672 | user@example.net | 679 | user@example.net |
680 | no-touch-required sk-ecdsa-sha2-nistp256@openssh.com AAAAInN...Ko== | ||
681 | user@example.net | ||
673 | .Ed | 682 | .Ed |
674 | .Sh SSH_KNOWN_HOSTS FILE FORMAT | 683 | .Sh SSH_KNOWN_HOSTS FILE FORMAT |
675 | The | 684 | The |