1 2 /* $OpenBSD: servconf.c,v 1.249 2014/01/29 06:18:35 djm Exp $ */ 3 /* 4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 5 * All rights reserved 6 * 7 * As far as I am concerned, the code I have written for this software 8 * can be used freely for any purpose. Any derived versions of this 9 * software must be clearly marked as such, and if the derived work is 10 * incompatible with the protocol description in the RFC file, it must be 11 * called by a name other than "ssh" or "Secure Shell". 12 */ 13 14 #include "includes.h" 15 __RCSID("$FreeBSD$"); 16 17 #include <sys/types.h> 18 #include <sys/socket.h> 19 20 #include <netinet/in.h> 21 #include <netinet/in_systm.h> 22 #include <netinet/ip.h> 23 24 #include <ctype.h> 25 #include <netdb.h> 26 #include <pwd.h> 27 #include <stdio.h> 28 #include <stdlib.h> 29 #include <string.h> 30 #include <signal.h> 31 #include <unistd.h> 32 #include <stdarg.h> 33 #include <errno.h> 34 #ifdef HAVE_UTIL_H 35 #include <util.h> 36 #endif 37 38 #include "openbsd-compat/sys-queue.h" 39 #include "xmalloc.h" 40 #include "ssh.h" 41 #include "log.h" 42 #include "buffer.h" 43 #include "servconf.h" 44 #include "compat.h" 45 #include "pathnames.h" 46 #include "misc.h" 47 #include "cipher.h" 48 #include "key.h" 49 #include "kex.h" 50 #include "mac.h" 51 #include "match.h" 52 #include "channels.h" 53 #include "groupaccess.h" 54 #include "canohost.h" 55 #include "packet.h" 56 #include "hostfile.h" 57 #include "auth.h" 58 #include "version.h" 59 60 static void add_listen_addr(ServerOptions *, char *, int); 61 static void add_one_listen_addr(ServerOptions *, char *, int); 62 63 /* Use of privilege separation or not */ 64 extern int use_privsep; 65 extern Buffer cfg; 66 67 /* Initializes the server options to their default values. */ 68 69 void 70 initialize_server_options(ServerOptions *options) 71 { 72 memset(options, 0, sizeof(*options)); 73 74 /* Portable-specific options */ 75 options->use_pam = -1; 76 77 /* Standard Options */ 78 options->num_ports = 0; 79 options->ports_from_cmdline = 0; 80 options->listen_addrs = NULL; 81 options->address_family = -1; 82 options->num_host_key_files = 0; 83 options->num_host_cert_files = 0; 84 options->host_key_agent = NULL; 85 options->pid_file = NULL; 86 options->server_key_bits = -1; 87 options->login_grace_time = -1; 88 options->key_regeneration_time = -1; 89 options->permit_root_login = PERMIT_NOT_SET; 90 options->ignore_rhosts = -1; 91 options->ignore_user_known_hosts = -1; 92 options->print_motd = -1; 93 options->print_lastlog = -1; 94 options->x11_forwarding = -1; 95 options->x11_display_offset = -1; 96 options->x11_use_localhost = -1; 97 options->permit_tty = -1; 98 options->xauth_location = NULL; 99 options->strict_modes = -1; 100 options->tcp_keep_alive = -1; 101 options->log_facility = SYSLOG_FACILITY_NOT_SET; 102 options->log_level = SYSLOG_LEVEL_NOT_SET; 103 options->rhosts_rsa_authentication = -1; 104 options->hostbased_authentication = -1; 105 options->hostbased_uses_name_from_packet_only = -1; 106 options->rsa_authentication = -1; 107 options->pubkey_authentication = -1; 108 options->kerberos_authentication = -1; 109 options->kerberos_or_local_passwd = -1; 110 options->kerberos_ticket_cleanup = -1; 111 options->kerberos_get_afs_token = -1; 112 options->gss_authentication=-1; 113 options->gss_cleanup_creds = -1; 114 options->password_authentication = -1; 115 options->kbd_interactive_authentication = -1; 116 options->challenge_response_authentication = -1; 117 options->permit_empty_passwd = -1; 118 options->permit_user_env = -1; 119 options->use_login = -1; 120 options->compression = -1; 121 options->rekey_limit = -1; 122 options->rekey_interval = -1; 123 options->allow_tcp_forwarding = -1; 124 options->allow_agent_forwarding = -1; 125 options->num_allow_users = 0; 126 options->num_deny_users = 0; 127 options->num_allow_groups = 0; 128 options->num_deny_groups = 0; 129 options->ciphers = NULL; 130 options->macs = NULL; 131 options->kex_algorithms = NULL; 132 options->protocol = SSH_PROTO_UNKNOWN; 133 options->gateway_ports = -1; 134 options->num_subsystems = 0; 135 options->max_startups_begin = -1; 136 options->max_startups_rate = -1; 137 options->max_startups = -1; 138 options->max_authtries = -1; 139 options->max_sessions = -1; 140 options->banner = NULL; 141 options->use_dns = -1; 142 options->client_alive_interval = -1; 143 options->client_alive_count_max = -1; 144 options->num_authkeys_files = 0; 145 options->num_accept_env = 0; 146 options->permit_tun = -1; 147 options->num_permitted_opens = -1; 148 options->adm_forced_command = NULL; 149 options->chroot_directory = NULL; 150 options->authorized_keys_command = NULL; 151 options->authorized_keys_command_user = NULL; 152 options->revoked_keys_file = NULL; 153 options->trusted_user_ca_keys = NULL; 154 options->authorized_principals_file = NULL; 155 options->ip_qos_interactive = -1; 156 options->ip_qos_bulk = -1; 157 options->version_addendum = NULL; 158 options->hpn_disabled = -1; 159 options->hpn_buffer_size = -1; 160 options->tcp_rcv_buf_poll = -1; 161 #ifdef NONE_CIPHER_ENABLED 162 options->none_enabled = -1; 163 #endif 164 } 165 166 void 167 fill_default_server_options(ServerOptions *options) 168 { 169 /* Portable-specific options */ 170 if (options->use_pam == -1) 171 options->use_pam = 1; 172 173 /* Standard Options */ 174 if (options->protocol == SSH_PROTO_UNKNOWN) 175 options->protocol = SSH_PROTO_2; 176 if (options->num_host_key_files == 0) { 177 /* fill default hostkeys for protocols */ 178 if (options->protocol & SSH_PROTO_1) 179 options->host_key_files[options->num_host_key_files++] = 180 _PATH_HOST_KEY_FILE; 181 if (options->protocol & SSH_PROTO_2) { 182 options->host_key_files[options->num_host_key_files++] = 183 _PATH_HOST_RSA_KEY_FILE; 184 options->host_key_files[options->num_host_key_files++] = 185 _PATH_HOST_DSA_KEY_FILE; 186 #ifdef OPENSSL_HAS_ECC 187 options->host_key_files[options->num_host_key_files++] = 188 _PATH_HOST_ECDSA_KEY_FILE; 189 #endif 190 options->host_key_files[options->num_host_key_files++] = 191 _PATH_HOST_ED25519_KEY_FILE; 192 } 193 } 194 /* No certificates by default */ 195 if (options->num_ports == 0) 196 options->ports[options->num_ports++] = SSH_DEFAULT_PORT; 197 if (options->listen_addrs == NULL) 198 add_listen_addr(options, NULL, 0); 199 if (options->pid_file == NULL) 200 options->pid_file = _PATH_SSH_DAEMON_PID_FILE; 201 if (options->server_key_bits == -1) 202 options->server_key_bits = 1024; 203 if (options->login_grace_time == -1) 204 options->login_grace_time = 120; 205 if (options->key_regeneration_time == -1) 206 options->key_regeneration_time = 3600; 207 if (options->permit_root_login == PERMIT_NOT_SET) 208 options->permit_root_login = PERMIT_NO; 209 if (options->ignore_rhosts == -1) 210 options->ignore_rhosts = 1; 211 if (options->ignore_user_known_hosts == -1) 212 options->ignore_user_known_hosts = 0; 213 if (options->print_motd == -1) 214 options->print_motd = 1; 215 if (options->print_lastlog == -1) 216 options->print_lastlog = 1; 217 if (options->x11_forwarding == -1) 218 options->x11_forwarding = 1; 219 if (options->x11_display_offset == -1) 220 options->x11_display_offset = 10; 221 if (options->x11_use_localhost == -1) 222 options->x11_use_localhost = 1; 223 if (options->xauth_location == NULL) 224 options->xauth_location = _PATH_XAUTH; 225 if (options->permit_tty == -1) 226 options->permit_tty = 1; 227 if (options->strict_modes == -1) 228 options->strict_modes = 1; 229 if (options->tcp_keep_alive == -1) 230 options->tcp_keep_alive = 1; 231 if (options->log_facility == SYSLOG_FACILITY_NOT_SET) 232 options->log_facility = SYSLOG_FACILITY_AUTH; 233 if (options->log_level == SYSLOG_LEVEL_NOT_SET) 234 options->log_level = SYSLOG_LEVEL_INFO; 235 if (options->rhosts_rsa_authentication == -1) 236 options->rhosts_rsa_authentication = 0; 237 if (options->hostbased_authentication == -1) 238 options->hostbased_authentication = 0; 239 if (options->hostbased_uses_name_from_packet_only == -1) 240 options->hostbased_uses_name_from_packet_only = 0; 241 if (options->rsa_authentication == -1) 242 options->rsa_authentication = 1; 243 if (options->pubkey_authentication == -1) 244 options->pubkey_authentication = 1; 245 if (options->kerberos_authentication == -1) 246 options->kerberos_authentication = 0; 247 if (options->kerberos_or_local_passwd == -1) 248 options->kerberos_or_local_passwd = 1; 249 if (options->kerberos_ticket_cleanup == -1) 250 options->kerberos_ticket_cleanup = 1; 251 if (options->kerberos_get_afs_token == -1) 252 options->kerberos_get_afs_token = 0; 253 if (options->gss_authentication == -1) 254 options->gss_authentication = 0; 255 if (options->gss_cleanup_creds == -1) 256 options->gss_cleanup_creds = 1; 257 if (options->password_authentication == -1) 258 options->password_authentication = 0; 259 if (options->kbd_interactive_authentication == -1) 260 options->kbd_interactive_authentication = 0; 261 if (options->challenge_response_authentication == -1) 262 options->challenge_response_authentication = 1; 263 if (options->permit_empty_passwd == -1) 264 options->permit_empty_passwd = 0; 265 if (options->permit_user_env == -1) 266 options->permit_user_env = 0; 267 if (options->use_login == -1) 268 options->use_login = 0; 269 if (options->compression == -1) 270 options->compression = COMP_DELAYED; 271 if (options->rekey_limit == -1) 272 options->rekey_limit = 0; 273 if (options->rekey_interval == -1) 274 options->rekey_interval = 0; 275 if (options->allow_tcp_forwarding == -1) 276 options->allow_tcp_forwarding = FORWARD_ALLOW; 277 if (options->allow_agent_forwarding == -1) 278 options->allow_agent_forwarding = 1; 279 if (options->gateway_ports == -1) 280 options->gateway_ports = 0; 281 if (options->max_startups == -1) 282 options->max_startups = 100; 283 if (options->max_startups_rate == -1) 284 options->max_startups_rate = 30; /* 30% */ 285 if (options->max_startups_begin == -1) 286 options->max_startups_begin = 10; 287 if (options->max_authtries == -1) 288 options->max_authtries = DEFAULT_AUTH_FAIL_MAX; 289 if (options->max_sessions == -1) 290 options->max_sessions = DEFAULT_SESSIONS_MAX; 291 if (options->use_dns == -1) 292 options->use_dns = 1; 293 if (options->client_alive_interval == -1) 294 options->client_alive_interval = 0; 295 if (options->client_alive_count_max == -1) 296 options->client_alive_count_max = 3; 297 if (options->num_authkeys_files == 0) { 298 options->authorized_keys_files[options->num_authkeys_files++] = 299 xstrdup(_PATH_SSH_USER_PERMITTED_KEYS); 300 options->authorized_keys_files[options->num_authkeys_files++] = 301 xstrdup(_PATH_SSH_USER_PERMITTED_KEYS2); 302 } 303 if (options->permit_tun == -1) 304 options->permit_tun = SSH_TUNMODE_NO; 305 if (options->ip_qos_interactive == -1) 306 options->ip_qos_interactive = IPTOS_LOWDELAY; 307 if (options->ip_qos_bulk == -1) 308 options->ip_qos_bulk = IPTOS_THROUGHPUT; 309 if (options->version_addendum == NULL) 310 options->version_addendum = xstrdup(SSH_VERSION_FREEBSD); 311 /* Turn privilege separation on by default */ 312 if (use_privsep == -1) 313 use_privsep = PRIVSEP_ON; 314 315 #ifndef HAVE_MMAP 316 if (use_privsep && options->compression == 1) { 317 error("This platform does not support both privilege " 318 "separation and compression"); 319 error("Compression disabled"); 320 options->compression = 0; 321 } 322 #endif 323 324 if (options->hpn_disabled == -1) 325 options->hpn_disabled = 0; 326 if (options->hpn_buffer_size == -1) { 327 /* 328 * HPN buffer size option not explicitly set. Try to figure 329 * out what value to use or resort to default. 330 */ 331 options->hpn_buffer_size = CHAN_SES_WINDOW_DEFAULT; 332 if (!options->hpn_disabled) { 333 sock_get_rcvbuf(&options->hpn_buffer_size, 0); 334 debug ("HPN Buffer Size: %d", options->hpn_buffer_size); 335 } 336 } else { 337 /* 338 * In the case that the user sets both values in a 339 * contradictory manner hpn_disabled overrrides hpn_buffer_size. 340 */ 341 if (options->hpn_disabled <= 0) { 342 u_int maxlen; 343 344 maxlen = buffer_get_max_len(); 345 if (options->hpn_buffer_size == 0) 346 options->hpn_buffer_size = 1; 347 /* Limit the maximum buffer to BUFFER_MAX_LEN. */ 348 if (options->hpn_buffer_size > maxlen / 1024) 349 options->hpn_buffer_size = maxlen; 350 else 351 options->hpn_buffer_size *= 1024; 352 } else { 353 options->hpn_buffer_size = CHAN_TCP_WINDOW_DEFAULT; 354 } 355 } 356 } 357 358 /* Keyword tokens. */ 359 typedef enum { 360 sBadOption, /* == unknown option */ 361 /* Portable-specific options */ 362 sUsePAM, 363 /* Standard Options */ 364 sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime, 365 sPermitRootLogin, sLogFacility, sLogLevel, 366 sRhostsRSAAuthentication, sRSAAuthentication, 367 sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, 368 sKerberosGetAFSToken, 369 sKerberosTgtPassing, sChallengeResponseAuthentication, 370 sPasswordAuthentication, sKbdInteractiveAuthentication, 371 sListenAddress, sAddressFamily, 372 sPrintMotd, sPrintLastLog, sIgnoreRhosts, 373 sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost, 374 sPermitTTY, sStrictModes, sEmptyPasswd, sTCPKeepAlive, 375 sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression, 376 sRekeyLimit, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups, 377 sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile, 378 sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, 379 sMaxStartups, sMaxAuthTries, sMaxSessions, 380 sBanner, sUseDNS, sHostbasedAuthentication, 381 sHostbasedUsesNameFromPacketOnly, sClientAliveInterval, 382 sClientAliveCountMax, sAuthorizedKeysFile, 383 sGssAuthentication, sGssCleanupCreds, sAcceptEnv, sPermitTunnel, 384 sMatch, sPermitOpen, sForceCommand, sChrootDirectory, 385 sUsePrivilegeSeparation, sAllowAgentForwarding, 386 sHostCertificate, 387 sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile, 388 sKexAlgorithms, sIPQoS, sVersionAddendum, 389 sAuthorizedKeysCommand, sAuthorizedKeysCommandUser, 390 sAuthenticationMethods, sHostKeyAgent, 391 sHPNDisabled, sHPNBufferSize, sTcpRcvBufPoll, 392 #ifdef NONE_CIPHER_ENABLED 393 sNoneEnabled, 394 #endif 395 sDeprecated, sUnsupported 396 } ServerOpCodes; 397 398 #define SSHCFG_GLOBAL 0x01 /* allowed in main section of sshd_config */ 399 #define SSHCFG_MATCH 0x02 /* allowed inside a Match section */ 400 #define SSHCFG_ALL (SSHCFG_GLOBAL|SSHCFG_MATCH) 401 402 /* Textual representation of the tokens. */ 403 static struct { 404 const char *name; 405 ServerOpCodes opcode; 406 u_int flags; 407 } keywords[] = { 408 /* Portable-specific options */ 409 #ifdef USE_PAM 410 { "usepam", sUsePAM, SSHCFG_GLOBAL }, 411 #else 412 { "usepam", sUnsupported, SSHCFG_GLOBAL }, 413 #endif 414 { "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL }, 415 /* Standard Options */ 416 { "port", sPort, SSHCFG_GLOBAL }, 417 { "hostkey", sHostKeyFile, SSHCFG_GLOBAL }, 418 { "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL }, /* alias */ 419 { "hostkeyagent", sHostKeyAgent, SSHCFG_GLOBAL }, 420 { "pidfile", sPidFile, SSHCFG_GLOBAL }, 421 { "serverkeybits", sServerKeyBits, SSHCFG_GLOBAL }, 422 { "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL }, 423 { "keyregenerationinterval", sKeyRegenerationTime, SSHCFG_GLOBAL }, 424 { "permitrootlogin", sPermitRootLogin, SSHCFG_ALL }, 425 { "syslogfacility", sLogFacility, SSHCFG_GLOBAL }, 426 { "loglevel", sLogLevel, SSHCFG_GLOBAL }, 427 { "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL }, 428 { "rhostsrsaauthentication", sRhostsRSAAuthentication, SSHCFG_ALL }, 429 { "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL }, 430 { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_ALL }, 431 { "rsaauthentication", sRSAAuthentication, SSHCFG_ALL }, 432 { "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL }, 433 { "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */ 434 #ifdef KRB5 435 { "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL }, 436 { "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL }, 437 { "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL }, 438 #ifdef USE_AFS 439 { "kerberosgetafstoken", sKerberosGetAFSToken, SSHCFG_GLOBAL }, 440 #else 441 { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, 442 #endif 443 #else 444 { "kerberosauthentication", sUnsupported, SSHCFG_ALL }, 445 { "kerberosorlocalpasswd", sUnsupported, SSHCFG_GLOBAL }, 446 { "kerberosticketcleanup", sUnsupported, SSHCFG_GLOBAL }, 447 { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, 448 #endif 449 { "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL }, 450 { "afstokenpassing", sUnsupported, SSHCFG_GLOBAL }, 451 #ifdef GSSAPI 452 { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL }, 453 { "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL }, 454 #else 455 { "gssapiauthentication", sUnsupported, SSHCFG_ALL }, 456 { "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL }, 457 #endif 458 { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL }, 459 { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, 460 { "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, 461 { "skeyauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, /* alias */ 462 { "checkmail", sDeprecated, SSHCFG_GLOBAL }, 463 { "listenaddress", sListenAddress, SSHCFG_GLOBAL }, 464 { "addressfamily", sAddressFamily, SSHCFG_GLOBAL }, 465 { "printmotd", sPrintMotd, SSHCFG_GLOBAL }, 466 { "printlastlog", sPrintLastLog, SSHCFG_GLOBAL }, 467 { "ignorerhosts", sIgnoreRhosts, SSHCFG_GLOBAL }, 468 { "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL }, 469 { "x11forwarding", sX11Forwarding, SSHCFG_ALL }, 470 { "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL }, 471 { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL }, 472 { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL }, 473 { "strictmodes", sStrictModes, SSHCFG_GLOBAL }, 474 { "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL }, 475 { "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL }, 476 { "uselogin", sUseLogin, SSHCFG_GLOBAL }, 477 { "compression", sCompression, SSHCFG_GLOBAL }, 478 { "rekeylimit", sRekeyLimit, SSHCFG_ALL }, 479 { "tcpkeepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, 480 { "keepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, /* obsolete alias */ 481 { "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL }, 482 { "allowagentforwarding", sAllowAgentForwarding, SSHCFG_ALL }, 483 { "allowusers", sAllowUsers, SSHCFG_ALL }, 484 { "denyusers", sDenyUsers, SSHCFG_ALL }, 485 { "allowgroups", sAllowGroups, SSHCFG_ALL }, 486 { "denygroups", sDenyGroups, SSHCFG_ALL }, 487 { "ciphers", sCiphers, SSHCFG_GLOBAL }, 488 { "macs", sMacs, SSHCFG_GLOBAL }, 489 { "protocol", sProtocol, SSHCFG_GLOBAL }, 490 { "gatewayports", sGatewayPorts, SSHCFG_ALL }, 491 { "subsystem", sSubsystem, SSHCFG_GLOBAL }, 492 { "maxstartups", sMaxStartups, SSHCFG_GLOBAL }, 493 { "maxauthtries", sMaxAuthTries, SSHCFG_ALL }, 494 { "maxsessions", sMaxSessions, SSHCFG_ALL }, 495 { "banner", sBanner, SSHCFG_ALL }, 496 { "usedns", sUseDNS, SSHCFG_GLOBAL }, 497 { "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL }, 498 { "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL }, 499 { "clientaliveinterval", sClientAliveInterval, SSHCFG_GLOBAL }, 500 { "clientalivecountmax", sClientAliveCountMax, SSHCFG_GLOBAL }, 501 { "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_ALL }, 502 { "authorizedkeysfile2", sDeprecated, SSHCFG_ALL }, 503 { "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL}, 504 { "acceptenv", sAcceptEnv, SSHCFG_ALL }, 505 { "permittunnel", sPermitTunnel, SSHCFG_ALL }, 506 { "permittty", sPermitTTY, SSHCFG_ALL }, 507 { "match", sMatch, SSHCFG_ALL }, 508 { "permitopen", sPermitOpen, SSHCFG_ALL }, 509 { "forcecommand", sForceCommand, SSHCFG_ALL }, 510 { "chrootdirectory", sChrootDirectory, SSHCFG_ALL }, 511 { "hostcertificate", sHostCertificate, SSHCFG_GLOBAL }, 512 { "revokedkeys", sRevokedKeys, SSHCFG_ALL }, 513 { "trustedusercakeys", sTrustedUserCAKeys, SSHCFG_ALL }, 514 { "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL }, 515 { "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL }, 516 { "ipqos", sIPQoS, SSHCFG_ALL }, 517 { "authorizedkeyscommand", sAuthorizedKeysCommand, SSHCFG_ALL }, 518 { "authorizedkeyscommanduser", sAuthorizedKeysCommandUser, SSHCFG_ALL }, 519 { "versionaddendum", sVersionAddendum, SSHCFG_GLOBAL }, 520 { "authenticationmethods", sAuthenticationMethods, SSHCFG_ALL }, 521 { "hpndisabled", sHPNDisabled, SSHCFG_ALL }, 522 { "hpnbuffersize", sHPNBufferSize, SSHCFG_ALL }, 523 { "tcprcvbufpoll", sTcpRcvBufPoll, SSHCFG_ALL }, 524 #ifdef NONE_CIPHER_ENABLED 525 { "noneenabled", sNoneEnabled, SSHCFG_ALL }, 526 #endif 527 { NULL, sBadOption, 0 } 528 }; 529 530 static struct { 531 int val; 532 char *text; 533 } tunmode_desc[] = { 534 { SSH_TUNMODE_NO, "no" }, 535 { SSH_TUNMODE_POINTOPOINT, "point-to-point" }, 536 { SSH_TUNMODE_ETHERNET, "ethernet" }, 537 { SSH_TUNMODE_YES, "yes" }, 538 { -1, NULL } 539 }; 540 541 /* 542 * Returns the number of the token pointed to by cp or sBadOption. 543 */ 544 545 static ServerOpCodes 546 parse_token(const char *cp, const char *filename, 547 int linenum, u_int *flags) 548 { 549 u_int i; 550 551 for (i = 0; keywords[i].name; i++) 552 if (strcasecmp(cp, keywords[i].name) == 0) { 553 *flags = keywords[i].flags; 554 return keywords[i].opcode; 555 } 556 557 error("%s: line %d: Bad configuration option: %s", 558 filename, linenum, cp); 559 return sBadOption; 560 } 561 562 char * 563 derelativise_path(const char *path) 564 { 565 char *expanded, *ret, cwd[MAXPATHLEN]; 566 567 expanded = tilde_expand_filename(path, getuid()); 568 if (*expanded == '/') 569 return expanded; 570 if (getcwd(cwd, sizeof(cwd)) == NULL) 571 fatal("%s: getcwd: %s", __func__, strerror(errno)); 572 xasprintf(&ret, "%s/%s", cwd, expanded); 573 free(expanded); 574 return ret; 575 } 576 577 static void 578 add_listen_addr(ServerOptions *options, char *addr, int port) 579 { 580 u_int i; 581 582 if (options->num_ports == 0) 583 options->ports[options->num_ports++] = SSH_DEFAULT_PORT; 584 if (options->address_family == -1) 585 options->address_family = AF_UNSPEC; 586 if (port == 0) 587 for (i = 0; i < options->num_ports; i++) 588 add_one_listen_addr(options, addr, options->ports[i]); 589 else 590 add_one_listen_addr(options, addr, port); 591 } 592 593 static void 594 add_one_listen_addr(ServerOptions *options, char *addr, int port) 595 { 596 struct addrinfo hints, *ai, *aitop; 597 char strport[NI_MAXSERV]; 598 int gaierr; 599 600 memset(&hints, 0, sizeof(hints)); 601 hints.ai_family = options->address_family; 602 hints.ai_socktype = SOCK_STREAM; 603 hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0; 604 snprintf(strport, sizeof strport, "%d", port); 605 if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0) 606 fatal("bad addr or host: %s (%s)", 607 addr ? addr : "<NULL>", 608 ssh_gai_strerror(gaierr)); 609 for (ai = aitop; ai->ai_next; ai = ai->ai_next) 610 ; 611 ai->ai_next = options->listen_addrs; 612 options->listen_addrs = aitop; 613 } 614 615 struct connection_info * 616 get_connection_info(int populate, int use_dns) 617 { 618 static struct connection_info ci; 619 620 if (!populate) 621 return &ci; 622 ci.host = get_canonical_hostname(use_dns); 623 ci.address = get_remote_ipaddr(); 624 ci.laddress = get_local_ipaddr(packet_get_connection_in()); 625 ci.lport = get_local_port(); 626 return &ci; 627 } 628 629 /* 630 * The strategy for the Match blocks is that the config file is parsed twice. 631 * 632 * The first time is at startup. activep is initialized to 1 and the 633 * directives in the global context are processed and acted on. Hitting a 634 * Match directive unsets activep and the directives inside the block are 635 * checked for syntax only. 636 * 637 * The second time is after a connection has been established but before 638 * authentication. activep is initialized to 2 and global config directives 639 * are ignored since they have already been processed. If the criteria in a 640 * Match block is met, activep is set and the subsequent directives 641 * processed and actioned until EOF or another Match block unsets it. Any 642 * options set are copied into the main server config. 643 * 644 * Potential additions/improvements: 645 * - Add Match support for pre-kex directives, eg Protocol, Ciphers. 646 * 647 * - Add a Tag directive (idea from David Leonard) ala pf, eg: 648 * Match Address 192.168.0.* 649 * Tag trusted 650 * Match Group wheel 651 * Tag trusted 652 * Match Tag trusted 653 * AllowTcpForwarding yes 654 * GatewayPorts clientspecified 655 * [...] 656 * 657 * - Add a PermittedChannelRequests directive 658 * Match Group shell 659 * PermittedChannelRequests session,forwarded-tcpip 660 */ 661 662 static int 663 match_cfg_line_group(const char *grps, int line, const char *user) 664 { 665 int result = 0; 666 struct passwd *pw; 667 668 if (user == NULL) 669 goto out; 670 671 if ((pw = getpwnam(user)) == NULL) { 672 debug("Can't match group at line %d because user %.100s does " 673 "not exist", line, user); 674 } else if (ga_init(pw->pw_name, pw->pw_gid) == 0) { 675 debug("Can't Match group because user %.100s not in any group " 676 "at line %d", user, line); 677 } else if (ga_match_pattern_list(grps) != 1) { 678 debug("user %.100s does not match group list %.100s at line %d", 679 user, grps, line); 680 } else { 681 debug("user %.100s matched group list %.100s at line %d", user, 682 grps, line); 683 result = 1; 684 } 685 out: 686 ga_free(); 687 return result; 688 } 689 690 /* 691 * All of the attributes on a single Match line are ANDed together, so we need 692 * to check every attribute and set the result to zero if any attribute does 693 * not match. 694 */ 695 static int 696 match_cfg_line(char **condition, int line, struct connection_info *ci) 697 { 698 int result = 1, attributes = 0, port; 699 char *arg, *attrib, *cp = *condition; 700 size_t len; 701 702 if (ci == NULL) 703 debug3("checking syntax for 'Match %s'", cp); 704 else 705 debug3("checking match for '%s' user %s host %s addr %s " 706 "laddr %s lport %d", cp, ci->user ? ci->user : "(null)", 707 ci->host ? ci->host : "(null)", 708 ci->address ? ci->address : "(null)", 709 ci->laddress ? ci->laddress : "(null)", ci->lport); 710 711 while ((attrib = strdelim(&cp)) && *attrib != '\0') { 712 attributes++; 713 if (strcasecmp(attrib, "all") == 0) { 714 if (attributes != 1 || 715 ((arg = strdelim(&cp)) != NULL && *arg != '\0')) { 716 error("'all' cannot be combined with other " 717 "Match attributes"); 718 return -1; 719 } 720 *condition = cp; 721 return 1; 722 } 723 if ((arg = strdelim(&cp)) == NULL || *arg == '\0') { 724 error("Missing Match criteria for %s", attrib); 725 return -1; 726 } 727 len = strlen(arg); 728 if (strcasecmp(attrib, "user") == 0) { 729 if (ci == NULL || ci->user == NULL) { 730 result = 0; 731 continue; 732 } 733 if (match_pattern_list(ci->user, arg, len, 0) != 1) 734 result = 0; 735 else 736 debug("user %.100s matched 'User %.100s' at " 737 "line %d", ci->user, arg, line); 738 } else if (strcasecmp(attrib, "group") == 0) { 739 if (ci == NULL || ci->user == NULL) { 740 result = 0; 741 continue; 742 } 743 switch (match_cfg_line_group(arg, line, ci->user)) { 744 case -1: 745 return -1; 746 case 0: 747 result = 0; 748 } 749 } else if (strcasecmp(attrib, "host") == 0) { 750 if (ci == NULL || ci->host == NULL) { 751 result = 0; 752 continue; 753 } 754 if (match_hostname(ci->host, arg, len) != 1) 755 result = 0; 756 else 757 debug("connection from %.100s matched 'Host " 758 "%.100s' at line %d", ci->host, arg, line); 759 } else if (strcasecmp(attrib, "address") == 0) { 760 if (ci == NULL || ci->address == NULL) { 761 result = 0; 762 continue; 763 } 764 switch (addr_match_list(ci->address, arg)) { 765 case 1: 766 debug("connection from %.100s matched 'Address " 767 "%.100s' at line %d", ci->address, arg, line); 768 break; 769 case 0: 770 case -1: 771 result = 0; 772 break; 773 case -2: 774 return -1; 775 } 776 } else if (strcasecmp(attrib, "localaddress") == 0){ 777 if (ci == NULL || ci->laddress == NULL) { 778 result = 0; 779 continue; 780 } 781 switch (addr_match_list(ci->laddress, arg)) { 782 case 1: 783 debug("connection from %.100s matched " 784 "'LocalAddress %.100s' at line %d", 785 ci->laddress, arg, line); 786 break; 787 case 0: 788 case -1: 789 result = 0; 790 break; 791 case -2: 792 return -1; 793 } 794 } else if (strcasecmp(attrib, "localport") == 0) { 795 if ((port = a2port(arg)) == -1) { 796 error("Invalid LocalPort '%s' on Match line", 797 arg); 798 return -1; 799 } 800 if (ci == NULL || ci->lport == 0) { 801 result = 0; 802 continue; 803 } 804 /* TODO support port lists */ 805 if (port == ci->lport) 806 debug("connection from %.100s matched " 807 "'LocalPort %d' at line %d", 808 ci->laddress, port, line); 809 else 810 result = 0; 811 } else { 812 error("Unsupported Match attribute %s", attrib); 813 return -1; 814 } 815 } 816 if (attributes == 0) { 817 error("One or more attributes required for Match"); 818 return -1; 819 } 820 if (ci != NULL) 821 debug3("match %sfound", result ? "" : "not "); 822 *condition = cp; 823 return result; 824 } 825 826 #define WHITESPACE " \t\r\n" 827 828 /* Multistate option parsing */ 829 struct multistate { 830 char *key; 831 int value; 832 }; 833 static const struct multistate multistate_addressfamily[] = { 834 { "inet", AF_INET }, 835 { "inet6", AF_INET6 }, 836 { "any", AF_UNSPEC }, 837 { NULL, -1 } 838 }; 839 static const struct multistate multistate_permitrootlogin[] = { 840 { "without-password", PERMIT_NO_PASSWD }, 841 { "forced-commands-only", PERMIT_FORCED_ONLY }, 842 { "yes", PERMIT_YES }, 843 { "no", PERMIT_NO }, 844 { NULL, -1 } 845 }; 846 static const struct multistate multistate_compression[] = { 847 { "delayed", COMP_DELAYED }, 848 { "yes", COMP_ZLIB }, 849 { "no", COMP_NONE }, 850 { NULL, -1 } 851 }; 852 static const struct multistate multistate_gatewayports[] = { 853 { "clientspecified", 2 }, 854 { "yes", 1 }, 855 { "no", 0 }, 856 { NULL, -1 } 857 }; 858 static const struct multistate multistate_privsep[] = { 859 { "yes", PRIVSEP_NOSANDBOX }, 860 { "sandbox", PRIVSEP_ON }, 861 { "nosandbox", PRIVSEP_NOSANDBOX }, 862 { "no", PRIVSEP_OFF }, 863 { NULL, -1 } 864 }; 865 static const struct multistate multistate_tcpfwd[] = { 866 { "yes", FORWARD_ALLOW }, 867 { "all", FORWARD_ALLOW }, 868 { "no", FORWARD_DENY }, 869 { "remote", FORWARD_REMOTE }, 870 { "local", FORWARD_LOCAL }, 871 { NULL, -1 } 872 }; 873 874 int 875 process_server_config_line(ServerOptions *options, char *line, 876 const char *filename, int linenum, int *activep, 877 struct connection_info *connectinfo) 878 { 879 char *cp, **charptr, *arg, *p; 880 int cmdline = 0, *intptr, value, value2, n, port; 881 SyslogFacility *log_facility_ptr; 882 LogLevel *log_level_ptr; 883 ServerOpCodes opcode; 884 u_int i, flags = 0; 885 size_t len; 886 long long val64; 887 const struct multistate *multistate_ptr; 888 889 cp = line; 890 if ((arg = strdelim(&cp)) == NULL) 891 return 0; 892 /* Ignore leading whitespace */ 893 if (*arg == '\0') 894 arg = strdelim(&cp); 895 if (!arg || !*arg || *arg == '#') 896 return 0; 897 intptr = NULL; 898 charptr = NULL; 899 opcode = parse_token(arg, filename, linenum, &flags); 900 901 if (activep == NULL) { /* We are processing a command line directive */ 902 cmdline = 1; 903 activep = &cmdline; 904 } 905 if (*activep && opcode != sMatch) 906 debug3("%s:%d setting %s %s", filename, linenum, arg, cp); 907 if (*activep == 0 && !(flags & SSHCFG_MATCH)) { 908 if (connectinfo == NULL) { 909 fatal("%s line %d: Directive '%s' is not allowed " 910 "within a Match block", filename, linenum, arg); 911 } else { /* this is a directive we have already processed */ 912 while (arg) 913 arg = strdelim(&cp); 914 return 0; 915 } 916 } 917 918 switch (opcode) { 919 /* Portable-specific options */ 920 case sUsePAM: 921 intptr = &options->use_pam; 922 goto parse_flag; 923 924 /* Standard Options */ 925 case sBadOption: 926 return -1; 927 case sPort: 928 /* ignore ports from configfile if cmdline specifies ports */ 929 if (options->ports_from_cmdline) 930 return 0; 931 if (options->listen_addrs != NULL) 932 fatal("%s line %d: ports must be specified before " 933 "ListenAddress.", filename, linenum); 934 if (options->num_ports >= MAX_PORTS) 935 fatal("%s line %d: too many ports.", 936 filename, linenum); 937 arg = strdelim(&cp); 938 if (!arg || *arg == '\0') 939 fatal("%s line %d: missing port number.", 940 filename, linenum); 941 options->ports[options->num_ports++] = a2port(arg); 942 if (options->ports[options->num_ports-1] <= 0) 943 fatal("%s line %d: Badly formatted port number.", 944 filename, linenum); 945 break; 946 947 case sServerKeyBits: 948 intptr = &options->server_key_bits; 949 parse_int: 950 arg = strdelim(&cp); 951 if (!arg || *arg == '\0') 952 fatal("%s line %d: missing integer value.", 953 filename, linenum); 954 value = atoi(arg); 955 if (*activep && *intptr == -1) 956 *intptr = value; 957 break; 958 959 case sLoginGraceTime: 960 intptr = &options->login_grace_time; 961 parse_time: 962 arg = strdelim(&cp); 963 if (!arg || *arg == '\0') 964 fatal("%s line %d: missing time value.", 965 filename, linenum); 966 if ((value = convtime(arg)) == -1) 967 fatal("%s line %d: invalid time value.", 968 filename, linenum); 969 if (*intptr == -1) 970 *intptr = value; 971 break; 972 973 case sKeyRegenerationTime: 974 intptr = &options->key_regeneration_time; 975 goto parse_time; 976 977 case sListenAddress: 978 arg = strdelim(&cp); 979 if (arg == NULL || *arg == '\0') 980 fatal("%s line %d: missing address", 981 filename, linenum); 982 /* check for bare IPv6 address: no "[]" and 2 or more ":" */ 983 if (strchr(arg, '[') == NULL && (p = strchr(arg, ':')) != NULL 984 && strchr(p+1, ':') != NULL) { 985 add_listen_addr(options, arg, 0); 986 break; 987 } 988 p = hpdelim(&arg); 989 if (p == NULL) 990 fatal("%s line %d: bad address:port usage", 991 filename, linenum); 992 p = cleanhostname(p); 993 if (arg == NULL) 994 port = 0; 995 else if ((port = a2port(arg)) <= 0) 996 fatal("%s line %d: bad port number", filename, linenum); 997 998 add_listen_addr(options, p, port); 999 1000 break; 1001 1002 case sAddressFamily: 1003 intptr = &options->address_family; 1004 multistate_ptr = multistate_addressfamily; 1005 if (options->listen_addrs != NULL) 1006 fatal("%s line %d: address family must be specified " 1007 "before ListenAddress.", filename, linenum); 1008 parse_multistate: 1009 arg = strdelim(&cp); 1010 if (!arg || *arg == '\0') 1011 fatal("%s line %d: missing argument.", 1012 filename, linenum); 1013 value = -1; 1014 for (i = 0; multistate_ptr[i].key != NULL; i++) { 1015 if (strcasecmp(arg, multistate_ptr[i].key) == 0) { 1016 value = multistate_ptr[i].value; 1017 break; 1018 } 1019 } 1020 if (value == -1) 1021 fatal("%s line %d: unsupported option \"%s\".", 1022 filename, linenum, arg); 1023 if (*activep && *intptr == -1) 1024 *intptr = value; 1025 break; 1026 1027 case sHostKeyFile: 1028 intptr = &options->num_host_key_files; 1029 if (*intptr >= MAX_HOSTKEYS) 1030 fatal("%s line %d: too many host keys specified (max %d).", 1031 filename, linenum, MAX_HOSTKEYS); 1032 charptr = &options->host_key_files[*intptr]; 1033 parse_filename: 1034 arg = strdelim(&cp); 1035 if (!arg || *arg == '\0') 1036 fatal("%s line %d: missing file name.", 1037 filename, linenum); 1038 if (*activep && *charptr == NULL) { 1039 *charptr = derelativise_path(arg); 1040 /* increase optional counter */ 1041 if (intptr != NULL) 1042 *intptr = *intptr + 1; 1043 } 1044 break; 1045 1046 case sHostKeyAgent: 1047 charptr = &options->host_key_agent; 1048 arg = strdelim(&cp); 1049 if (!arg || *arg == '\0') 1050 fatal("%s line %d: missing socket name.", 1051 filename, linenum); 1052 if (*activep && *charptr == NULL) 1053 *charptr = !strcmp(arg, SSH_AUTHSOCKET_ENV_NAME) ? 1054 xstrdup(arg) : derelativise_path(arg); 1055 break; 1056 1057 case sHostCertificate: 1058 intptr = &options->num_host_cert_files; 1059 if (*intptr >= MAX_HOSTKEYS) 1060 fatal("%s line %d: too many host certificates " 1061 "specified (max %d).", filename, linenum, 1062 MAX_HOSTCERTS); 1063 charptr = &options->host_cert_files[*intptr]; 1064 goto parse_filename; 1065 break; 1066 1067 case sPidFile: 1068 charptr = &options->pid_file; 1069 goto parse_filename; 1070 1071 case sPermitRootLogin: 1072 intptr = &options->permit_root_login; 1073 multistate_ptr = multistate_permitrootlogin; 1074 goto parse_multistate; 1075 1076 case sIgnoreRhosts: 1077 intptr = &options->ignore_rhosts; 1078 parse_flag: 1079 arg = strdelim(&cp); 1080 if (!arg || *arg == '\0') 1081 fatal("%s line %d: missing yes/no argument.", 1082 filename, linenum); 1083 value = 0; /* silence compiler */ 1084 if (strcmp(arg, "yes") == 0) 1085 value = 1; 1086 else if (strcmp(arg, "no") == 0) 1087 value = 0; 1088 else 1089 fatal("%s line %d: Bad yes/no argument: %s", 1090 filename, linenum, arg); 1091 if (*activep && *intptr == -1) 1092 *intptr = value; 1093 break; 1094 1095 case sIgnoreUserKnownHosts: 1096 intptr = &options->ignore_user_known_hosts; 1097 goto parse_flag; 1098 1099 case sRhostsRSAAuthentication: 1100 intptr = &options->rhosts_rsa_authentication; 1101 goto parse_flag; 1102 1103 case sHostbasedAuthentication: 1104 intptr = &options->hostbased_authentication; 1105 goto parse_flag; 1106 1107 case sHostbasedUsesNameFromPacketOnly: 1108 intptr = &options->hostbased_uses_name_from_packet_only; 1109 goto parse_flag; 1110 1111 case sRSAAuthentication: 1112 intptr = &options->rsa_authentication; 1113 goto parse_flag; 1114 1115 case sPubkeyAuthentication: 1116 intptr = &options->pubkey_authentication; 1117 goto parse_flag; 1118 1119 case sKerberosAuthentication: 1120 intptr = &options->kerberos_authentication; 1121 goto parse_flag; 1122 1123 case sKerberosOrLocalPasswd: 1124 intptr = &options->kerberos_or_local_passwd; 1125 goto parse_flag; 1126 1127 case sKerberosTicketCleanup: 1128 intptr = &options->kerberos_ticket_cleanup; 1129 goto parse_flag; 1130 1131 case sKerberosGetAFSToken: 1132 intptr = &options->kerberos_get_afs_token; 1133 goto parse_flag; 1134 1135 case sGssAuthentication: 1136 intptr = &options->gss_authentication; 1137 goto parse_flag; 1138 1139 case sGssCleanupCreds: 1140 intptr = &options->gss_cleanup_creds; 1141 goto parse_flag; 1142 1143 case sPasswordAuthentication: 1144 intptr = &options->password_authentication; 1145 goto parse_flag; 1146 1147 case sKbdInteractiveAuthentication: 1148 intptr = &options->kbd_interactive_authentication; 1149 goto parse_flag; 1150 1151 case sChallengeResponseAuthentication: 1152 intptr = &options->challenge_response_authentication; 1153 goto parse_flag; 1154 1155 case sPrintMotd: 1156 intptr = &options->print_motd; 1157 goto parse_flag; 1158 1159 case sPrintLastLog: 1160 intptr = &options->print_lastlog; 1161 goto parse_flag; 1162 1163 case sX11Forwarding: 1164 intptr = &options->x11_forwarding; 1165 goto parse_flag; 1166 1167 case sX11DisplayOffset: 1168 intptr = &options->x11_display_offset; 1169 goto parse_int; 1170 1171 case sX11UseLocalhost: 1172 intptr = &options->x11_use_localhost; 1173 goto parse_flag; 1174 1175 case sXAuthLocation: 1176 charptr = &options->xauth_location; 1177 goto parse_filename; 1178 1179 case sPermitTTY: 1180 intptr = &options->permit_tty; 1181 goto parse_flag; 1182 1183 case sStrictModes: 1184 intptr = &options->strict_modes; 1185 goto parse_flag; 1186 1187 case sTCPKeepAlive: 1188 intptr = &options->tcp_keep_alive; 1189 goto parse_flag; 1190 1191 case sEmptyPasswd: 1192 intptr = &options->permit_empty_passwd; 1193 goto parse_flag; 1194 1195 case sPermitUserEnvironment: 1196 intptr = &options->permit_user_env; 1197 goto parse_flag; 1198 1199 case sUseLogin: 1200 intptr = &options->use_login; 1201 goto parse_flag; 1202 1203 case sCompression: 1204 intptr = &options->compression; 1205 multistate_ptr = multistate_compression; 1206 goto parse_multistate; 1207 1208 case sRekeyLimit: 1209 arg = strdelim(&cp); 1210 if (!arg || *arg == '\0') 1211 fatal("%.200s line %d: Missing argument.", filename, 1212 linenum); 1213 if (strcmp(arg, "default") == 0) { 1214 val64 = 0; 1215 } else { 1216 if (scan_scaled(arg, &val64) == -1) 1217 fatal("%.200s line %d: Bad number '%s': %s", 1218 filename, linenum, arg, strerror(errno)); 1219 /* check for too-large or too-small limits */ 1220 if (val64 > UINT_MAX) 1221 fatal("%.200s line %d: RekeyLimit too large", 1222 filename, linenum); 1223 if (val64 != 0 && val64 < 16) 1224 fatal("%.200s line %d: RekeyLimit too small", 1225 filename, linenum); 1226 } 1227 if (*activep && options->rekey_limit == -1) 1228 options->rekey_limit = (u_int32_t)val64; 1229 if (cp != NULL) { /* optional rekey interval present */ 1230 if (strcmp(cp, "none") == 0) { 1231 (void)strdelim(&cp); /* discard */ 1232 break; 1233 } 1234 intptr = &options->rekey_interval; 1235 goto parse_time; 1236 } 1237 break; 1238 1239 case sGatewayPorts: 1240 intptr = &options->gateway_ports; 1241 multistate_ptr = multistate_gatewayports; 1242 goto parse_multistate; 1243 1244 case sUseDNS: 1245 intptr = &options->use_dns; 1246 goto parse_flag; 1247 1248 case sLogFacility: 1249 log_facility_ptr = &options->log_facility; 1250 arg = strdelim(&cp); 1251 value = log_facility_number(arg); 1252 if (value == SYSLOG_FACILITY_NOT_SET) 1253 fatal("%.200s line %d: unsupported log facility '%s'", 1254 filename, linenum, arg ? arg : "<NONE>"); 1255 if (*log_facility_ptr == -1) 1256 *log_facility_ptr = (SyslogFacility) value; 1257 break; 1258 1259 case sLogLevel: 1260 log_level_ptr = &options->log_level; 1261 arg = strdelim(&cp); 1262 value = log_level_number(arg); 1263 if (value == SYSLOG_LEVEL_NOT_SET) 1264 fatal("%.200s line %d: unsupported log level '%s'", 1265 filename, linenum, arg ? arg : "<NONE>"); 1266 if (*log_level_ptr == -1) 1267 *log_level_ptr = (LogLevel) value; 1268 break; 1269 1270 case sAllowTcpForwarding: 1271 intptr = &options->allow_tcp_forwarding; 1272 multistate_ptr = multistate_tcpfwd; 1273 goto parse_multistate; 1274 1275 case sAllowAgentForwarding: 1276 intptr = &options->allow_agent_forwarding; 1277 goto parse_flag; 1278 1279 case sUsePrivilegeSeparation: 1280 intptr = &use_privsep; 1281 multistate_ptr = multistate_privsep; 1282 goto parse_multistate; 1283 1284 case sAllowUsers: 1285 while ((arg = strdelim(&cp)) && *arg != '\0') { 1286 if (options->num_allow_users >= MAX_ALLOW_USERS) 1287 fatal("%s line %d: too many allow users.", 1288 filename, linenum); 1289 if (!*activep) 1290 continue; 1291 options->allow_users[options->num_allow_users++] = 1292 xstrdup(arg); 1293 } 1294 break; 1295 1296 case sDenyUsers: 1297 while ((arg = strdelim(&cp)) && *arg != '\0') { 1298 if (options->num_deny_users >= MAX_DENY_USERS) 1299 fatal("%s line %d: too many deny users.", 1300 filename, linenum); 1301 if (!*activep) 1302 continue; 1303 options->deny_users[options->num_deny_users++] = 1304 xstrdup(arg); 1305 } 1306 break; 1307 1308 case sAllowGroups: 1309 while ((arg = strdelim(&cp)) && *arg != '\0') { 1310 if (options->num_allow_groups >= MAX_ALLOW_GROUPS) 1311 fatal("%s line %d: too many allow groups.", 1312 filename, linenum); 1313 if (!*activep) 1314 continue; 1315 options->allow_groups[options->num_allow_groups++] = 1316 xstrdup(arg); 1317 } 1318 break; 1319 1320 case sDenyGroups: 1321 while ((arg = strdelim(&cp)) && *arg != '\0') { 1322 if (options->num_deny_groups >= MAX_DENY_GROUPS) 1323 fatal("%s line %d: too many deny groups.", 1324 filename, linenum); 1325 if (!*activep) 1326 continue; 1327 options->deny_groups[options->num_deny_groups++] = 1328 xstrdup(arg); 1329 } 1330 break; 1331 1332 case sCiphers: 1333 arg = strdelim(&cp); 1334 if (!arg || *arg == '\0') 1335 fatal("%s line %d: Missing argument.", filename, linenum); 1336 if (!ciphers_valid(arg)) 1337 fatal("%s line %d: Bad SSH2 cipher spec '%s'.", 1338 filename, linenum, arg ? arg : "<NONE>"); 1339 if (options->ciphers == NULL) 1340 options->ciphers = xstrdup(arg); 1341 break; 1342 1343 case sMacs: 1344 arg = strdelim(&cp); 1345 if (!arg || *arg == '\0') 1346 fatal("%s line %d: Missing argument.", filename, linenum); 1347 if (!mac_valid(arg)) 1348 fatal("%s line %d: Bad SSH2 mac spec '%s'.", 1349 filename, linenum, arg ? arg : "<NONE>"); 1350 if (options->macs == NULL) 1351 options->macs = xstrdup(arg); 1352 break; 1353 1354 case sKexAlgorithms: 1355 arg = strdelim(&cp); 1356 if (!arg || *arg == '\0') 1357 fatal("%s line %d: Missing argument.", 1358 filename, linenum); 1359 if (!kex_names_valid(arg)) 1360 fatal("%s line %d: Bad SSH2 KexAlgorithms '%s'.", 1361 filename, linenum, arg ? arg : "<NONE>"); 1362 if (options->kex_algorithms == NULL) 1363 options->kex_algorithms = xstrdup(arg); 1364 break; 1365 1366 case sProtocol: 1367 intptr = &options->protocol; 1368 arg = strdelim(&cp); 1369 if (!arg || *arg == '\0') 1370 fatal("%s line %d: Missing argument.", filename, linenum); 1371 value = proto_spec(arg); 1372 if (value == SSH_PROTO_UNKNOWN) 1373 fatal("%s line %d: Bad protocol spec '%s'.", 1374 filename, linenum, arg ? arg : "<NONE>"); 1375 if (*intptr == SSH_PROTO_UNKNOWN) 1376 *intptr = value; 1377 break; 1378 1379 case sSubsystem: 1380 if (options->num_subsystems >= MAX_SUBSYSTEMS) { 1381 fatal("%s line %d: too many subsystems defined.", 1382 filename, linenum); 1383 } 1384 arg = strdelim(&cp); 1385 if (!arg || *arg == '\0') 1386 fatal("%s line %d: Missing subsystem name.", 1387 filename, linenum); 1388 if (!*activep) { 1389 arg = strdelim(&cp); 1390 break; 1391 } 1392 for (i = 0; i < options->num_subsystems; i++) 1393 if (strcmp(arg, options->subsystem_name[i]) == 0) 1394 fatal("%s line %d: Subsystem '%s' already defined.", 1395 filename, linenum, arg); 1396 options->subsystem_name[options->num_subsystems] = xstrdup(arg); 1397 arg = strdelim(&cp); 1398 if (!arg || *arg == '\0') 1399 fatal("%s line %d: Missing subsystem command.", 1400 filename, linenum); 1401 options->subsystem_command[options->num_subsystems] = xstrdup(arg); 1402 1403 /* Collect arguments (separate to executable) */ 1404 p = xstrdup(arg); 1405 len = strlen(p) + 1; 1406 while ((arg = strdelim(&cp)) != NULL && *arg != '\0') { 1407 len += 1 + strlen(arg); 1408 p = xrealloc(p, 1, len); 1409 strlcat(p, " ", len); 1410 strlcat(p, arg, len); 1411 } 1412 options->subsystem_args[options->num_subsystems] = p; 1413 options->num_subsystems++; 1414 break; 1415 1416 case sMaxStartups: 1417 arg = strdelim(&cp); 1418 if (!arg || *arg == '\0') 1419 fatal("%s line %d: Missing MaxStartups spec.", 1420 filename, linenum); 1421 if ((n = sscanf(arg, "%d:%d:%d", 1422 &options->max_startups_begin, 1423 &options->max_startups_rate, 1424 &options->max_startups)) == 3) { 1425 if (options->max_startups_begin > 1426 options->max_startups || 1427 options->max_startups_rate > 100 || 1428 options->max_startups_rate < 1) 1429 fatal("%s line %d: Illegal MaxStartups spec.", 1430 filename, linenum); 1431 } else if (n != 1) 1432 fatal("%s line %d: Illegal MaxStartups spec.", 1433 filename, linenum); 1434 else 1435 options->max_startups = options->max_startups_begin; 1436 break; 1437 1438 case sMaxAuthTries: 1439 intptr = &options->max_authtries; 1440 goto parse_int; 1441 1442 case sMaxSessions: 1443 intptr = &options->max_sessions; 1444 goto parse_int; 1445 1446 case sBanner: 1447 charptr = &options->banner; 1448 goto parse_filename; 1449 1450 /* 1451 * These options can contain %X options expanded at 1452 * connect time, so that you can specify paths like: 1453 * 1454 * AuthorizedKeysFile /etc/ssh_keys/%u 1455 */ 1456 case sAuthorizedKeysFile: 1457 if (*activep && options->num_authkeys_files == 0) { 1458 while ((arg = strdelim(&cp)) && *arg != '\0') { 1459 if (options->num_authkeys_files >= 1460 MAX_AUTHKEYS_FILES) 1461 fatal("%s line %d: " 1462 "too many authorized keys files.", 1463 filename, linenum); 1464 options->authorized_keys_files[ 1465 options->num_authkeys_files++] = 1466 tilde_expand_filename(arg, getuid()); 1467 } 1468 } 1469 return 0; 1470 1471 case sAuthorizedPrincipalsFile: 1472 charptr = &options->authorized_principals_file; 1473 arg = strdelim(&cp); 1474 if (!arg || *arg == '\0') 1475 fatal("%s line %d: missing file name.", 1476 filename, linenum); 1477 if (*activep && *charptr == NULL) { 1478 *charptr = tilde_expand_filename(arg, getuid()); 1479 /* increase optional counter */ 1480 if (intptr != NULL) 1481 *intptr = *intptr + 1; 1482 } 1483 break; 1484 1485 case sClientAliveInterval: 1486 intptr = &options->client_alive_interval; 1487 goto parse_time; 1488 1489 case sClientAliveCountMax: 1490 intptr = &options->client_alive_count_max; 1491 goto parse_int; 1492 1493 case sAcceptEnv: 1494 while ((arg = strdelim(&cp)) && *arg != '\0') { 1495 if (strchr(arg, '=') != NULL) 1496 fatal("%s line %d: Invalid environment name.", 1497 filename, linenum); 1498 if (options->num_accept_env >= MAX_ACCEPT_ENV) 1499 fatal("%s line %d: too many allow env.", 1500 filename, linenum); 1501 if (!*activep) 1502 continue; 1503 options->accept_env[options->num_accept_env++] = 1504 xstrdup(arg); 1505 } 1506 break; 1507 1508 case sPermitTunnel: 1509 intptr = &options->permit_tun; 1510 arg = strdelim(&cp); 1511 if (!arg || *arg == '\0') 1512 fatal("%s line %d: Missing yes/point-to-point/" 1513 "ethernet/no argument.", filename, linenum); 1514 value = -1; 1515 for (i = 0; tunmode_desc[i].val != -1; i++) 1516 if (strcmp(tunmode_desc[i].text, arg) == 0) { 1517 value = tunmode_desc[i].val; 1518 break; 1519 } 1520 if (value == -1) 1521 fatal("%s line %d: Bad yes/point-to-point/ethernet/" 1522 "no argument: %s", filename, linenum, arg); 1523 if (*intptr == -1) 1524 *intptr = value; 1525 break; 1526 1527 case sMatch: 1528 if (cmdline) 1529 fatal("Match directive not supported as a command-line " 1530 "option"); 1531 value = match_cfg_line(&cp, linenum, connectinfo); 1532 if (value < 0) 1533 fatal("%s line %d: Bad Match condition", filename, 1534 linenum); 1535 *activep = value; 1536 break; 1537 1538 case sPermitOpen: 1539 arg = strdelim(&cp); 1540 if (!arg || *arg == '\0') 1541 fatal("%s line %d: missing PermitOpen specification", 1542 filename, linenum); 1543 n = options->num_permitted_opens; /* modified later */ 1544 if (strcmp(arg, "any") == 0) { 1545 if (*activep && n == -1) { 1546 channel_clear_adm_permitted_opens(); 1547 options->num_permitted_opens = 0; 1548 } 1549 break; 1550 } 1551 if (strcmp(arg, "none") == 0) { 1552 if (*activep && n == -1) { 1553 options->num_permitted_opens = 1; 1554 channel_disable_adm_local_opens(); 1555 } 1556 break; 1557 } 1558 if (*activep && n == -1) 1559 channel_clear_adm_permitted_opens(); 1560 for (; arg != NULL && *arg != '\0'; arg = strdelim(&cp)) { 1561 p = hpdelim(&arg); 1562 if (p == NULL) 1563 fatal("%s line %d: missing host in PermitOpen", 1564 filename, linenum); 1565 p = cleanhostname(p); 1566 if (arg == NULL || ((port = permitopen_port(arg)) < 0)) 1567 fatal("%s line %d: bad port number in " 1568 "PermitOpen", filename, linenum); 1569 if (*activep && n == -1) 1570 options->num_permitted_opens = 1571 channel_add_adm_permitted_opens(p, port); 1572 } 1573 break; 1574 1575 case sForceCommand: 1576 if (cp == NULL) 1577 fatal("%.200s line %d: Missing argument.", filename, 1578 linenum); 1579 len = strspn(cp, WHITESPACE); 1580 if (*activep && options->adm_forced_command == NULL) 1581 options->adm_forced_command = xstrdup(cp + len); 1582 return 0; 1583 1584 case sChrootDirectory: 1585 charptr = &options->chroot_directory; 1586 1587 arg = strdelim(&cp); 1588 if (!arg || *arg == '\0') 1589 fatal("%s line %d: missing file name.", 1590 filename, linenum); 1591 if (*activep && *charptr == NULL) 1592 *charptr = xstrdup(arg); 1593 break; 1594 1595 case sTrustedUserCAKeys: 1596 charptr = &options->trusted_user_ca_keys; 1597 goto parse_filename; 1598 1599 case sRevokedKeys: 1600 charptr = &options->revoked_keys_file; 1601 goto parse_filename; 1602 1603 case sIPQoS: 1604 arg = strdelim(&cp); 1605 if ((value = parse_ipqos(arg)) == -1) 1606 fatal("%s line %d: Bad IPQoS value: %s", 1607 filename, linenum, arg); 1608 arg = strdelim(&cp); 1609 if (arg == NULL) 1610 value2 = value; 1611 else if ((value2 = parse_ipqos(arg)) == -1) 1612 fatal("%s line %d: Bad IPQoS value: %s", 1613 filename, linenum, arg); 1614 if (*activep) { 1615 options->ip_qos_interactive = value; 1616 options->ip_qos_bulk = value2; 1617 } 1618 break; 1619 1620 case sVersionAddendum: 1621 if (cp == NULL) 1622 fatal("%.200s line %d: Missing argument.", filename, 1623 linenum); 1624 len = strspn(cp, WHITESPACE); 1625 if (*activep && options->version_addendum == NULL) { 1626 if (strcasecmp(cp + len, "none") == 0) 1627 options->version_addendum = xstrdup(""); 1628 else if (strchr(cp + len, '\r') != NULL) 1629 fatal("%.200s line %d: Invalid argument", 1630 filename, linenum); 1631 else 1632 options->version_addendum = xstrdup(cp + len); 1633 } 1634 return 0; 1635 1636 case sAuthorizedKeysCommand: 1637 len = strspn(cp, WHITESPACE); 1638 if (*activep && options->authorized_keys_command == NULL) { 1639 if (cp[len] != '/' && strcasecmp(cp + len, "none") != 0) 1640 fatal("%.200s line %d: AuthorizedKeysCommand " 1641 "must be an absolute path", 1642 filename, linenum); 1643 options->authorized_keys_command = xstrdup(cp + len); 1644 } 1645 return 0; 1646 1647 case sAuthorizedKeysCommandUser: 1648 charptr = &options->authorized_keys_command_user; 1649 1650 arg = strdelim(&cp); 1651 if (*activep && *charptr == NULL) 1652 *charptr = xstrdup(arg); 1653 break; 1654 1655 case sAuthenticationMethods: 1656 if (*activep && options->num_auth_methods == 0) { 1657 while ((arg = strdelim(&cp)) && *arg != '\0') { 1658 if (options->num_auth_methods >= 1659 MAX_AUTH_METHODS) 1660 fatal("%s line %d: " 1661 "too many authentication methods.", 1662 filename, linenum); 1663 if (auth2_methods_valid(arg, 0) != 0) 1664 fatal("%s line %d: invalid " 1665 "authentication method list.", 1666 filename, linenum); 1667 options->auth_methods[ 1668 options->num_auth_methods++] = xstrdup(arg); 1669 } 1670 } 1671 return 0; 1672 1673 case sHPNDisabled: 1674 intptr = &options->hpn_disabled; 1675 goto parse_flag; 1676 1677 case sHPNBufferSize: 1678 intptr = &options->hpn_buffer_size; 1679 goto parse_int; 1680 1681 case sTcpRcvBufPoll: 1682 intptr = &options->tcp_rcv_buf_poll; 1683 goto parse_flag; 1684 1685 #ifdef NONE_CIPHER_ENABLED 1686 case sNoneEnabled: 1687 intptr = &options->none_enabled; 1688 goto parse_flag; 1689 #endif 1690 1691 case sDeprecated: 1692 logit("%s line %d: Deprecated option %s", 1693 filename, linenum, arg); 1694 while (arg) 1695 arg = strdelim(&cp); 1696 break; 1697 1698 case sUnsupported: 1699 logit("%s line %d: Unsupported option %s", 1700 filename, linenum, arg); 1701 while (arg) 1702 arg = strdelim(&cp); 1703 break; 1704 1705 default: 1706 fatal("%s line %d: Missing handler for opcode %s (%d)", 1707 filename, linenum, arg, opcode); 1708 } 1709 if ((arg = strdelim(&cp)) != NULL && *arg != '\0') 1710 fatal("%s line %d: garbage at end of line; \"%.200s\".", 1711 filename, linenum, arg); 1712 return 0; 1713 } 1714 1715 /* Reads the server configuration file. */ 1716 1717 void 1718 load_server_config(const char *filename, Buffer *conf) 1719 { 1720 char line[4096], *cp; 1721 FILE *f; 1722 int lineno = 0; 1723 1724 debug2("%s: filename %s", __func__, filename); 1725 if ((f = fopen(filename, "r")) == NULL) { 1726 perror(filename); 1727 exit(1); 1728 } 1729 buffer_clear(conf); 1730 while (fgets(line, sizeof(line), f)) { 1731 lineno++; 1732 if (strlen(line) == sizeof(line) - 1) 1733 fatal("%s line %d too long", filename, lineno); 1734 /* 1735 * Trim out comments and strip whitespace 1736 * NB - preserve newlines, they are needed to reproduce 1737 * line numbers later for error messages 1738 */ 1739 if ((cp = strchr(line, '#')) != NULL) 1740 memcpy(cp, "\n", 2); 1741 cp = line + strspn(line, " \t\r"); 1742 1743 buffer_append(conf, cp, strlen(cp)); 1744 } 1745 buffer_append(conf, "\0", 1); 1746 fclose(f); 1747 debug2("%s: done config len = %d", __func__, buffer_len(conf)); 1748 } 1749 1750 void 1751 parse_server_match_config(ServerOptions *options, 1752 struct connection_info *connectinfo) 1753 { 1754 ServerOptions mo; 1755 1756 initialize_server_options(&mo); 1757 parse_server_config(&mo, "reprocess config", &cfg, connectinfo); 1758 copy_set_server_options(options, &mo, 0); 1759 } 1760 1761 int parse_server_match_testspec(struct connection_info *ci, char *spec) 1762 { 1763 char *p; 1764 1765 while ((p = strsep(&spec, ",")) && *p != '\0') { 1766 if (strncmp(p, "addr=", 5) == 0) { 1767 ci->address = xstrdup(p + 5); 1768 } else if (strncmp(p, "host=", 5) == 0) { 1769 ci->host = xstrdup(p + 5); 1770 } else if (strncmp(p, "user=", 5) == 0) { 1771 ci->user = xstrdup(p + 5); 1772 } else if (strncmp(p, "laddr=", 6) == 0) { 1773 ci->laddress = xstrdup(p + 6); 1774 } else if (strncmp(p, "lport=", 6) == 0) { 1775 ci->lport = a2port(p + 6); 1776 if (ci->lport == -1) { 1777 fprintf(stderr, "Invalid port '%s' in test mode" 1778 " specification %s\n", p+6, p); 1779 return -1; 1780 } 1781 } else { 1782 fprintf(stderr, "Invalid test mode specification %s\n", 1783 p); 1784 return -1; 1785 } 1786 } 1787 return 0; 1788 } 1789 1790 /* 1791 * returns 1 for a complete spec, 0 for partial spec and -1 for an 1792 * empty spec. 1793 */ 1794 int server_match_spec_complete(struct connection_info *ci) 1795 { 1796 if (ci->user && ci->host && ci->address) 1797 return 1; /* complete */ 1798 if (!ci->user && !ci->host && !ci->address) 1799 return -1; /* empty */ 1800 return 0; /* partial */ 1801 } 1802 1803 /* 1804 * Copy any supported values that are set. 1805 * 1806 * If the preauth flag is set, we do not bother copying the string or 1807 * array values that are not used pre-authentication, because any that we 1808 * do use must be explictly sent in mm_getpwnamallow(). 1809 */ 1810 void 1811 copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) 1812 { 1813 #define M_CP_INTOPT(n) do {\ 1814 if (src->n != -1) \ 1815 dst->n = src->n; \ 1816 } while (0) 1817 1818 M_CP_INTOPT(password_authentication); 1819 M_CP_INTOPT(gss_authentication); 1820 M_CP_INTOPT(rsa_authentication); 1821 M_CP_INTOPT(pubkey_authentication); 1822 M_CP_INTOPT(kerberos_authentication); 1823 M_CP_INTOPT(hostbased_authentication); 1824 M_CP_INTOPT(hostbased_uses_name_from_packet_only); 1825 M_CP_INTOPT(kbd_interactive_authentication); 1826 M_CP_INTOPT(permit_root_login); 1827 M_CP_INTOPT(permit_empty_passwd); 1828 1829 M_CP_INTOPT(allow_tcp_forwarding); 1830 M_CP_INTOPT(allow_agent_forwarding); 1831 M_CP_INTOPT(permit_tun); 1832 M_CP_INTOPT(gateway_ports); 1833 M_CP_INTOPT(x11_display_offset); 1834 M_CP_INTOPT(x11_forwarding); 1835 M_CP_INTOPT(x11_use_localhost); 1836 M_CP_INTOPT(permit_tty); 1837 M_CP_INTOPT(max_sessions); 1838 M_CP_INTOPT(max_authtries); 1839 M_CP_INTOPT(ip_qos_interactive); 1840 M_CP_INTOPT(ip_qos_bulk); 1841 M_CP_INTOPT(rekey_limit); 1842 M_CP_INTOPT(rekey_interval); 1843 1844 /* M_CP_STROPT and M_CP_STRARRAYOPT should not appear before here */ 1845 #define M_CP_STROPT(n) do {\ 1846 if (src->n != NULL && dst->n != src->n) { \ 1847 free(dst->n); \ 1848 dst->n = src->n; \ 1849 } \ 1850 } while(0) 1851 #define M_CP_STRARRAYOPT(n, num_n) do {\ 1852 if (src->num_n != 0) { \ 1853 for (dst->num_n = 0; dst->num_n < src->num_n; dst->num_n++) \ 1854 dst->n[dst->num_n] = xstrdup(src->n[dst->num_n]); \ 1855 } \ 1856 } while(0) 1857 1858 /* See comment in servconf.h */ 1859 COPY_MATCH_STRING_OPTS(); 1860 1861 /* 1862 * The only things that should be below this point are string options 1863 * which are only used after authentication. 1864 */ 1865 if (preauth) 1866 return; 1867 1868 M_CP_STROPT(adm_forced_command); 1869 M_CP_STROPT(chroot_directory); 1870 } 1871 1872 #undef M_CP_INTOPT 1873 #undef M_CP_STROPT 1874 #undef M_CP_STRARRAYOPT 1875 1876 void 1877 parse_server_config(ServerOptions *options, const char *filename, Buffer *conf, 1878 struct connection_info *connectinfo) 1879 { 1880 int active, linenum, bad_options = 0; 1881 char *cp, *obuf, *cbuf; 1882 1883 debug2("%s: config %s len %d", __func__, filename, buffer_len(conf)); 1884 1885 obuf = cbuf = xstrdup(buffer_ptr(conf)); 1886 active = connectinfo ? 0 : 1; 1887 linenum = 1; 1888 while ((cp = strsep(&cbuf, "\n")) != NULL) { 1889 if (process_server_config_line(options, cp, filename, 1890 linenum++, &active, connectinfo) != 0) 1891 bad_options++; 1892 } 1893 free(obuf); 1894 if (bad_options > 0) 1895 fatal("%s: terminating, %d bad configuration options", 1896 filename, bad_options); 1897 } 1898 1899 static const char * 1900 fmt_multistate_int(int val, const struct multistate *m) 1901 { 1902 u_int i; 1903 1904 for (i = 0; m[i].key != NULL; i++) { 1905 if (m[i].value == val) 1906 return m[i].key; 1907 } 1908 return "UNKNOWN"; 1909 } 1910 1911 static const char * 1912 fmt_intarg(ServerOpCodes code, int val) 1913 { 1914 if (val == -1) 1915 return "unset"; 1916 switch (code) { 1917 case sAddressFamily: 1918 return fmt_multistate_int(val, multistate_addressfamily); 1919 case sPermitRootLogin: 1920 return fmt_multistate_int(val, multistate_permitrootlogin); 1921 case sGatewayPorts: 1922 return fmt_multistate_int(val, multistate_gatewayports); 1923 case sCompression: 1924 return fmt_multistate_int(val, multistate_compression); 1925 case sUsePrivilegeSeparation: 1926 return fmt_multistate_int(val, multistate_privsep); 1927 case sAllowTcpForwarding: 1928 return fmt_multistate_int(val, multistate_tcpfwd); 1929 case sProtocol: 1930 switch (val) { 1931 case SSH_PROTO_1: 1932 return "1"; 1933 case SSH_PROTO_2: 1934 return "2"; 1935 case (SSH_PROTO_1|SSH_PROTO_2): 1936 return "2,1"; 1937 default: 1938 return "UNKNOWN"; 1939 } 1940 default: 1941 switch (val) { 1942 case 0: 1943 return "no"; 1944 case 1: 1945 return "yes"; 1946 default: 1947 return "UNKNOWN"; 1948 } 1949 } 1950 } 1951 1952 static const char * 1953 lookup_opcode_name(ServerOpCodes code) 1954 { 1955 u_int i; 1956 1957 for (i = 0; keywords[i].name != NULL; i++) 1958 if (keywords[i].opcode == code) 1959 return(keywords[i].name); 1960 return "UNKNOWN"; 1961 } 1962 1963 static void 1964 dump_cfg_int(ServerOpCodes code, int val) 1965 { 1966 printf("%s %d\n", lookup_opcode_name(code), val); 1967 } 1968 1969 static void 1970 dump_cfg_fmtint(ServerOpCodes code, int val) 1971 { 1972 printf("%s %s\n", lookup_opcode_name(code), fmt_intarg(code, val)); 1973 } 1974 1975 static void 1976 dump_cfg_string(ServerOpCodes code, const char *val) 1977 { 1978 if (val == NULL) 1979 return; 1980 printf("%s %s\n", lookup_opcode_name(code), val); 1981 } 1982 1983 static void 1984 dump_cfg_strarray(ServerOpCodes code, u_int count, char **vals) 1985 { 1986 u_int i; 1987 1988 for (i = 0; i < count; i++) 1989 printf("%s %s\n", lookup_opcode_name(code), vals[i]); 1990 } 1991 1992 static void 1993 dump_cfg_strarray_oneline(ServerOpCodes code, u_int count, char **vals) 1994 { 1995 u_int i; 1996 1997 printf("%s", lookup_opcode_name(code)); 1998 for (i = 0; i < count; i++) 1999 printf(" %s", vals[i]); 2000 printf("\n"); 2001 } 2002 2003 void 2004 dump_config(ServerOptions *o) 2005 { 2006 u_int i; 2007 int ret; 2008 struct addrinfo *ai; 2009 char addr[NI_MAXHOST], port[NI_MAXSERV], *s = NULL; 2010 2011 /* these are usually at the top of the config */ 2012 for (i = 0; i < o->num_ports; i++) 2013 printf("port %d\n", o->ports[i]); 2014 dump_cfg_fmtint(sProtocol, o->protocol); 2015 dump_cfg_fmtint(sAddressFamily, o->address_family); 2016 2017 /* ListenAddress must be after Port */ 2018 for (ai = o->listen_addrs; ai; ai = ai->ai_next) { 2019 if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen, addr, 2020 sizeof(addr), port, sizeof(port), 2021 NI_NUMERICHOST|NI_NUMERICSERV)) != 0) { 2022 error("getnameinfo failed: %.100s", 2023 (ret != EAI_SYSTEM) ? gai_strerror(ret) : 2024 strerror(errno)); 2025 } else { 2026 if (ai->ai_family == AF_INET6) 2027 printf("listenaddress [%s]:%s\n", addr, port); 2028 else 2029 printf("listenaddress %s:%s\n", addr, port); 2030 } 2031 } 2032 2033 /* integer arguments */ 2034 #ifdef USE_PAM 2035 dump_cfg_int(sUsePAM, o->use_pam); 2036 #endif 2037 dump_cfg_int(sServerKeyBits, o->server_key_bits); 2038 dump_cfg_int(sLoginGraceTime, o->login_grace_time); 2039 dump_cfg_int(sKeyRegenerationTime, o->key_regeneration_time); 2040 dump_cfg_int(sX11DisplayOffset, o->x11_display_offset); 2041 dump_cfg_int(sMaxAuthTries, o->max_authtries); 2042 dump_cfg_int(sMaxSessions, o->max_sessions); 2043 dump_cfg_int(sClientAliveInterval, o->client_alive_interval); 2044 dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max); 2045 2046 /* formatted integer arguments */ 2047 dump_cfg_fmtint(sPermitRootLogin, o->permit_root_login); 2048 dump_cfg_fmtint(sIgnoreRhosts, o->ignore_rhosts); 2049 dump_cfg_fmtint(sIgnoreUserKnownHosts, o->ignore_user_known_hosts); 2050 dump_cfg_fmtint(sRhostsRSAAuthentication, o->rhosts_rsa_authentication); 2051 dump_cfg_fmtint(sHostbasedAuthentication, o->hostbased_authentication); 2052 dump_cfg_fmtint(sHostbasedUsesNameFromPacketOnly, 2053 o->hostbased_uses_name_from_packet_only); 2054 dump_cfg_fmtint(sRSAAuthentication, o->rsa_authentication); 2055 dump_cfg_fmtint(sPubkeyAuthentication, o->pubkey_authentication); 2056 #ifdef KRB5 2057 dump_cfg_fmtint(sKerberosAuthentication, o->kerberos_authentication); 2058 dump_cfg_fmtint(sKerberosOrLocalPasswd, o->kerberos_or_local_passwd); 2059 dump_cfg_fmtint(sKerberosTicketCleanup, o->kerberos_ticket_cleanup); 2060 # ifdef USE_AFS 2061 dump_cfg_fmtint(sKerberosGetAFSToken, o->kerberos_get_afs_token); 2062 # endif 2063 #endif 2064 #ifdef GSSAPI 2065 dump_cfg_fmtint(sGssAuthentication, o->gss_authentication); 2066 dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds); 2067 #endif 2068 dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication); 2069 dump_cfg_fmtint(sKbdInteractiveAuthentication, 2070 o->kbd_interactive_authentication); 2071 dump_cfg_fmtint(sChallengeResponseAuthentication, 2072 o->challenge_response_authentication); 2073 dump_cfg_fmtint(sPrintMotd, o->print_motd); 2074 dump_cfg_fmtint(sPrintLastLog, o->print_lastlog); 2075 dump_cfg_fmtint(sX11Forwarding, o->x11_forwarding); 2076 dump_cfg_fmtint(sX11UseLocalhost, o->x11_use_localhost); 2077 dump_cfg_fmtint(sPermitTTY, o->permit_tty); 2078 dump_cfg_fmtint(sStrictModes, o->strict_modes); 2079 dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive); 2080 dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd); 2081 dump_cfg_fmtint(sPermitUserEnvironment, o->permit_user_env); 2082 dump_cfg_fmtint(sUseLogin, o->use_login); 2083 dump_cfg_fmtint(sCompression, o->compression); 2084 dump_cfg_fmtint(sGatewayPorts, o->gateway_ports); 2085 dump_cfg_fmtint(sUseDNS, o->use_dns); 2086 dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding); 2087 dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep); 2088 2089 /* string arguments */ 2090 dump_cfg_string(sPidFile, o->pid_file); 2091 dump_cfg_string(sXAuthLocation, o->xauth_location); 2092 dump_cfg_string(sCiphers, o->ciphers ? o->ciphers : 2093 cipher_alg_list(',', 0)); 2094 dump_cfg_string(sMacs, o->macs ? o->macs : mac_alg_list(',')); 2095 dump_cfg_string(sBanner, o->banner); 2096 dump_cfg_string(sForceCommand, o->adm_forced_command); 2097 dump_cfg_string(sChrootDirectory, o->chroot_directory); 2098 dump_cfg_string(sTrustedUserCAKeys, o->trusted_user_ca_keys); 2099 dump_cfg_string(sRevokedKeys, o->revoked_keys_file); 2100 dump_cfg_string(sAuthorizedPrincipalsFile, 2101 o->authorized_principals_file); 2102 dump_cfg_string(sVersionAddendum, o->version_addendum); 2103 dump_cfg_string(sAuthorizedKeysCommand, o->authorized_keys_command); 2104 dump_cfg_string(sAuthorizedKeysCommandUser, o->authorized_keys_command_user); 2105 dump_cfg_string(sHostKeyAgent, o->host_key_agent); 2106 dump_cfg_string(sKexAlgorithms, o->kex_algorithms ? o->kex_algorithms : 2107 kex_alg_list(',')); 2108 2109 /* string arguments requiring a lookup */ 2110 dump_cfg_string(sLogLevel, log_level_name(o->log_level)); 2111 dump_cfg_string(sLogFacility, log_facility_name(o->log_facility)); 2112 2113 /* string array arguments */ 2114 dump_cfg_strarray_oneline(sAuthorizedKeysFile, o->num_authkeys_files, 2115 o->authorized_keys_files); 2116 dump_cfg_strarray(sHostKeyFile, o->num_host_key_files, 2117 o->host_key_files); 2118 dump_cfg_strarray(sHostKeyFile, o->num_host_cert_files, 2119 o->host_cert_files); 2120 dump_cfg_strarray(sAllowUsers, o->num_allow_users, o->allow_users); 2121 dump_cfg_strarray(sDenyUsers, o->num_deny_users, o->deny_users); 2122 dump_cfg_strarray(sAllowGroups, o->num_allow_groups, o->allow_groups); 2123 dump_cfg_strarray(sDenyGroups, o->num_deny_groups, o->deny_groups); 2124 dump_cfg_strarray(sAcceptEnv, o->num_accept_env, o->accept_env); 2125 dump_cfg_strarray_oneline(sAuthenticationMethods, 2126 o->num_auth_methods, o->auth_methods); 2127 2128 /* other arguments */ 2129 for (i = 0; i < o->num_subsystems; i++) 2130 printf("subsystem %s %s\n", o->subsystem_name[i], 2131 o->subsystem_args[i]); 2132 2133 printf("maxstartups %d:%d:%d\n", o->max_startups_begin, 2134 o->max_startups_rate, o->max_startups); 2135 2136 for (i = 0; tunmode_desc[i].val != -1; i++) 2137 if (tunmode_desc[i].val == o->permit_tun) { 2138 s = tunmode_desc[i].text; 2139 break; 2140 } 2141 dump_cfg_string(sPermitTunnel, s); 2142 2143 printf("ipqos %s ", iptos2str(o->ip_qos_interactive)); 2144 printf("%s\n", iptos2str(o->ip_qos_bulk)); 2145 2146 printf("rekeylimit %lld %d\n", (long long)o->rekey_limit, 2147 o->rekey_interval); 2148 2149 channel_print_adm_permitted_opens(); 2150 } 2151