1 /* $OpenBSD: servconf.c,v 1.202 2010/01/13 03:48:12 djm Exp $ */
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
6 * As far as I am concerned, the code I have written for this software
7 * can be used freely for any purpose. Any derived versions of this
8 * software must be clearly marked as such, and if the derived work is
9 * incompatible with the protocol description in the RFC file, it must be
10 * called by a name other than "ssh" or "Secure Shell".
15 #include <sys/types.h>
16 #include <sys/socket.h>
28 #include "openbsd-compat/sys-queue.h"
35 #include "pathnames.h"
43 #include "groupaccess.h"
45 static void add_listen_addr(ServerOptions *, char *, int);
46 static void add_one_listen_addr(ServerOptions *, char *, int);
48 /* Use of privilege separation or not */
49 extern int use_privsep;
52 /* Initializes the server options to their default values. */
55 initialize_server_options(ServerOptions *options)
57 memset(options, 0, sizeof(*options));
59 /* Portable-specific options */
60 options->use_pam = -1;
62 /* Standard Options */
63 options->num_ports = 0;
64 options->ports_from_cmdline = 0;
65 options->listen_addrs = NULL;
66 options->address_family = -1;
67 options->num_host_key_files = 0;
68 options->pid_file = NULL;
69 options->server_key_bits = -1;
70 options->login_grace_time = -1;
71 options->key_regeneration_time = -1;
72 options->permit_root_login = PERMIT_NOT_SET;
73 options->ignore_rhosts = -1;
74 options->ignore_user_known_hosts = -1;
75 options->print_motd = -1;
76 options->print_lastlog = -1;
77 options->x11_forwarding = -1;
78 options->x11_display_offset = -1;
79 options->x11_use_localhost = -1;
80 options->xauth_location = NULL;
81 options->strict_modes = -1;
82 options->tcp_keep_alive = -1;
83 options->log_facility = SYSLOG_FACILITY_NOT_SET;
84 options->log_level = SYSLOG_LEVEL_NOT_SET;
85 options->rhosts_rsa_authentication = -1;
86 options->hostbased_authentication = -1;
87 options->hostbased_uses_name_from_packet_only = -1;
88 options->rsa_authentication = -1;
89 options->pubkey_authentication = -1;
90 options->kerberos_authentication = -1;
91 options->kerberos_or_local_passwd = -1;
92 options->kerberos_ticket_cleanup = -1;
93 options->kerberos_get_afs_token = -1;
94 options->gss_authentication=-1;
95 options->gss_cleanup_creds = -1;
96 options->password_authentication = -1;
97 options->kbd_interactive_authentication = -1;
98 options->challenge_response_authentication = -1;
99 options->permit_empty_passwd = -1;
100 options->permit_user_env = -1;
101 options->use_login = -1;
102 options->compression = -1;
103 options->allow_tcp_forwarding = -1;
104 options->allow_agent_forwarding = -1;
105 options->num_allow_users = 0;
106 options->num_deny_users = 0;
107 options->num_allow_groups = 0;
108 options->num_deny_groups = 0;
109 options->ciphers = NULL;
110 options->macs = NULL;
111 options->protocol = SSH_PROTO_UNKNOWN;
112 options->gateway_ports = -1;
113 options->num_subsystems = 0;
114 options->max_startups_begin = -1;
115 options->max_startups_rate = -1;
116 options->max_startups = -1;
117 options->max_authtries = -1;
118 options->max_sessions = -1;
119 options->banner = NULL;
120 options->use_dns = -1;
121 options->client_alive_interval = -1;
122 options->client_alive_count_max = -1;
123 options->authorized_keys_file = NULL;
124 options->authorized_keys_file2 = NULL;
125 options->num_accept_env = 0;
126 options->permit_tun = -1;
127 options->num_permitted_opens = -1;
128 options->adm_forced_command = NULL;
129 options->chroot_directory = NULL;
130 options->zero_knowledge_password_authentication = -1;
134 fill_default_server_options(ServerOptions *options)
136 /* Portable-specific options */
137 if (options->use_pam == -1)
138 options->use_pam = 0;
140 /* Standard Options */
141 if (options->protocol == SSH_PROTO_UNKNOWN)
142 options->protocol = SSH_PROTO_2;
143 if (options->num_host_key_files == 0) {
144 /* fill default hostkeys for protocols */
145 if (options->protocol & SSH_PROTO_1)
146 options->host_key_files[options->num_host_key_files++] =
148 if (options->protocol & SSH_PROTO_2) {
149 options->host_key_files[options->num_host_key_files++] =
150 _PATH_HOST_RSA_KEY_FILE;
151 options->host_key_files[options->num_host_key_files++] =
152 _PATH_HOST_DSA_KEY_FILE;
155 if (options->num_ports == 0)
156 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
157 if (options->listen_addrs == NULL)
158 add_listen_addr(options, NULL, 0);
159 if (options->pid_file == NULL)
160 options->pid_file = _PATH_SSH_DAEMON_PID_FILE;
161 if (options->server_key_bits == -1)
162 options->server_key_bits = 1024;
163 if (options->login_grace_time == -1)
164 options->login_grace_time = 120;
165 if (options->key_regeneration_time == -1)
166 options->key_regeneration_time = 3600;
167 if (options->permit_root_login == PERMIT_NOT_SET)
168 options->permit_root_login = PERMIT_YES;
169 if (options->ignore_rhosts == -1)
170 options->ignore_rhosts = 1;
171 if (options->ignore_user_known_hosts == -1)
172 options->ignore_user_known_hosts = 0;
173 if (options->print_motd == -1)
174 options->print_motd = 1;
175 if (options->print_lastlog == -1)
176 options->print_lastlog = 1;
177 if (options->x11_forwarding == -1)
178 options->x11_forwarding = 0;
179 if (options->x11_display_offset == -1)
180 options->x11_display_offset = 10;
181 if (options->x11_use_localhost == -1)
182 options->x11_use_localhost = 1;
183 if (options->xauth_location == NULL)
184 options->xauth_location = _PATH_XAUTH;
185 if (options->strict_modes == -1)
186 options->strict_modes = 1;
187 if (options->tcp_keep_alive == -1)
188 options->tcp_keep_alive = 1;
189 if (options->log_facility == SYSLOG_FACILITY_NOT_SET)
190 options->log_facility = SYSLOG_FACILITY_AUTH;
191 if (options->log_level == SYSLOG_LEVEL_NOT_SET)
192 options->log_level = SYSLOG_LEVEL_INFO;
193 if (options->rhosts_rsa_authentication == -1)
194 options->rhosts_rsa_authentication = 0;
195 if (options->hostbased_authentication == -1)
196 options->hostbased_authentication = 0;
197 if (options->hostbased_uses_name_from_packet_only == -1)
198 options->hostbased_uses_name_from_packet_only = 0;
199 if (options->rsa_authentication == -1)
200 options->rsa_authentication = 1;
201 if (options->pubkey_authentication == -1)
202 options->pubkey_authentication = 1;
203 if (options->kerberos_authentication == -1)
204 options->kerberos_authentication = 0;
205 if (options->kerberos_or_local_passwd == -1)
206 options->kerberos_or_local_passwd = 1;
207 if (options->kerberos_ticket_cleanup == -1)
208 options->kerberos_ticket_cleanup = 1;
209 if (options->kerberos_get_afs_token == -1)
210 options->kerberos_get_afs_token = 0;
211 if (options->gss_authentication == -1)
212 options->gss_authentication = 0;
213 if (options->gss_cleanup_creds == -1)
214 options->gss_cleanup_creds = 1;
215 if (options->password_authentication == -1)
216 options->password_authentication = 1;
217 if (options->kbd_interactive_authentication == -1)
218 options->kbd_interactive_authentication = 0;
219 if (options->challenge_response_authentication == -1)
220 options->challenge_response_authentication = 1;
221 if (options->permit_empty_passwd == -1)
222 options->permit_empty_passwd = 0;
223 if (options->permit_user_env == -1)
224 options->permit_user_env = 0;
225 if (options->use_login == -1)
226 options->use_login = 0;
227 if (options->compression == -1)
228 options->compression = COMP_DELAYED;
229 if (options->allow_tcp_forwarding == -1)
230 options->allow_tcp_forwarding = 1;
231 if (options->allow_agent_forwarding == -1)
232 options->allow_agent_forwarding = 1;
233 if (options->gateway_ports == -1)
234 options->gateway_ports = 0;
235 if (options->max_startups == -1)
236 options->max_startups = 10;
237 if (options->max_startups_rate == -1)
238 options->max_startups_rate = 100; /* 100% */
239 if (options->max_startups_begin == -1)
240 options->max_startups_begin = options->max_startups;
241 if (options->max_authtries == -1)
242 options->max_authtries = DEFAULT_AUTH_FAIL_MAX;
243 if (options->max_sessions == -1)
244 options->max_sessions = DEFAULT_SESSIONS_MAX;
245 if (options->use_dns == -1)
246 options->use_dns = 1;
247 if (options->client_alive_interval == -1)
248 options->client_alive_interval = 0;
249 if (options->client_alive_count_max == -1)
250 options->client_alive_count_max = 3;
251 if (options->authorized_keys_file2 == NULL) {
252 /* authorized_keys_file2 falls back to authorized_keys_file */
253 if (options->authorized_keys_file != NULL)
254 options->authorized_keys_file2 = options->authorized_keys_file;
256 options->authorized_keys_file2 = _PATH_SSH_USER_PERMITTED_KEYS2;
258 if (options->authorized_keys_file == NULL)
259 options->authorized_keys_file = _PATH_SSH_USER_PERMITTED_KEYS;
260 if (options->permit_tun == -1)
261 options->permit_tun = SSH_TUNMODE_NO;
262 if (options->zero_knowledge_password_authentication == -1)
263 options->zero_knowledge_password_authentication = 0;
265 /* Turn privilege separation on by default */
266 if (use_privsep == -1)
270 if (use_privsep && options->compression == 1) {
271 error("This platform does not support both privilege "
272 "separation and compression");
273 error("Compression disabled");
274 options->compression = 0;
280 /* Keyword tokens. */
282 sBadOption, /* == unknown option */
283 /* Portable-specific options */
285 /* Standard Options */
286 sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,
287 sPermitRootLogin, sLogFacility, sLogLevel,
288 sRhostsRSAAuthentication, sRSAAuthentication,
289 sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,
290 sKerberosGetAFSToken,
291 sKerberosTgtPassing, sChallengeResponseAuthentication,
292 sPasswordAuthentication, sKbdInteractiveAuthentication,
293 sListenAddress, sAddressFamily,
294 sPrintMotd, sPrintLastLog, sIgnoreRhosts,
295 sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,
296 sStrictModes, sEmptyPasswd, sTCPKeepAlive,
297 sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression,
298 sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
299 sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
300 sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem,
301 sMaxStartups, sMaxAuthTries, sMaxSessions,
302 sBanner, sUseDNS, sHostbasedAuthentication,
303 sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,
304 sClientAliveCountMax, sAuthorizedKeysFile, sAuthorizedKeysFile2,
305 sGssAuthentication, sGssCleanupCreds, sAcceptEnv, sPermitTunnel,
306 sMatch, sPermitOpen, sForceCommand, sChrootDirectory,
307 sUsePrivilegeSeparation, sAllowAgentForwarding,
308 sZeroKnowledgePasswordAuthentication,
309 sDeprecated, sUnsupported
312 #define SSHCFG_GLOBAL 0x01 /* allowed in main section of sshd_config */
313 #define SSHCFG_MATCH 0x02 /* allowed inside a Match section */
314 #define SSHCFG_ALL (SSHCFG_GLOBAL|SSHCFG_MATCH)
316 /* Textual representation of the tokens. */
319 ServerOpCodes opcode;
322 /* Portable-specific options */
324 { "usepam", sUsePAM, SSHCFG_GLOBAL },
326 { "usepam", sUnsupported, SSHCFG_GLOBAL },
328 { "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL },
329 /* Standard Options */
330 { "port", sPort, SSHCFG_GLOBAL },
331 { "hostkey", sHostKeyFile, SSHCFG_GLOBAL },
332 { "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL }, /* alias */
333 { "pidfile", sPidFile, SSHCFG_GLOBAL },
334 { "serverkeybits", sServerKeyBits, SSHCFG_GLOBAL },
335 { "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL },
336 { "keyregenerationinterval", sKeyRegenerationTime, SSHCFG_GLOBAL },
337 { "permitrootlogin", sPermitRootLogin, SSHCFG_ALL },
338 { "syslogfacility", sLogFacility, SSHCFG_GLOBAL },
339 { "loglevel", sLogLevel, SSHCFG_GLOBAL },
340 { "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL },
341 { "rhostsrsaauthentication", sRhostsRSAAuthentication, SSHCFG_ALL },
342 { "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL },
343 { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_GLOBAL },
344 { "rsaauthentication", sRSAAuthentication, SSHCFG_ALL },
345 { "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL },
346 { "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */
348 { "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL },
349 { "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL },
350 { "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL },
352 { "kerberosgetafstoken", sKerberosGetAFSToken, SSHCFG_GLOBAL },
354 { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL },
357 { "kerberosauthentication", sUnsupported, SSHCFG_ALL },
358 { "kerberosorlocalpasswd", sUnsupported, SSHCFG_GLOBAL },
359 { "kerberosticketcleanup", sUnsupported, SSHCFG_GLOBAL },
360 { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL },
362 { "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL },
363 { "afstokenpassing", sUnsupported, SSHCFG_GLOBAL },
365 { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
366 { "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL },
368 { "gssapiauthentication", sUnsupported, SSHCFG_ALL },
369 { "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL },
371 { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
372 { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
373 { "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL },
374 { "skeyauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, /* alias */
376 { "zeroknowledgepasswordauthentication", sZeroKnowledgePasswordAuthentication, SSHCFG_ALL },
378 { "zeroknowledgepasswordauthentication", sUnsupported, SSHCFG_ALL },
380 { "checkmail", sDeprecated, SSHCFG_GLOBAL },
381 { "listenaddress", sListenAddress, SSHCFG_GLOBAL },
382 { "addressfamily", sAddressFamily, SSHCFG_GLOBAL },
383 { "printmotd", sPrintMotd, SSHCFG_GLOBAL },
384 { "printlastlog", sPrintLastLog, SSHCFG_GLOBAL },
385 { "ignorerhosts", sIgnoreRhosts, SSHCFG_GLOBAL },
386 { "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL },
387 { "x11forwarding", sX11Forwarding, SSHCFG_ALL },
388 { "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL },
389 { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL },
390 { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL },
391 { "strictmodes", sStrictModes, SSHCFG_GLOBAL },
392 { "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL },
393 { "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL },
394 { "uselogin", sUseLogin, SSHCFG_GLOBAL },
395 { "compression", sCompression, SSHCFG_GLOBAL },
396 { "tcpkeepalive", sTCPKeepAlive, SSHCFG_GLOBAL },
397 { "keepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, /* obsolete alias */
398 { "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL },
399 { "allowagentforwarding", sAllowAgentForwarding, SSHCFG_ALL },
400 { "allowusers", sAllowUsers, SSHCFG_GLOBAL },
401 { "denyusers", sDenyUsers, SSHCFG_GLOBAL },
402 { "allowgroups", sAllowGroups, SSHCFG_GLOBAL },
403 { "denygroups", sDenyGroups, SSHCFG_GLOBAL },
404 { "ciphers", sCiphers, SSHCFG_GLOBAL },
405 { "macs", sMacs, SSHCFG_GLOBAL },
406 { "protocol", sProtocol, SSHCFG_GLOBAL },
407 { "gatewayports", sGatewayPorts, SSHCFG_ALL },
408 { "subsystem", sSubsystem, SSHCFG_GLOBAL },
409 { "maxstartups", sMaxStartups, SSHCFG_GLOBAL },
410 { "maxauthtries", sMaxAuthTries, SSHCFG_ALL },
411 { "maxsessions", sMaxSessions, SSHCFG_ALL },
412 { "banner", sBanner, SSHCFG_ALL },
413 { "usedns", sUseDNS, SSHCFG_GLOBAL },
414 { "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL },
415 { "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL },
416 { "clientaliveinterval", sClientAliveInterval, SSHCFG_GLOBAL },
417 { "clientalivecountmax", sClientAliveCountMax, SSHCFG_GLOBAL },
418 { "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_GLOBAL },
419 { "authorizedkeysfile2", sAuthorizedKeysFile2, SSHCFG_GLOBAL },
420 { "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL},
421 { "acceptenv", sAcceptEnv, SSHCFG_GLOBAL },
422 { "permittunnel", sPermitTunnel, SSHCFG_GLOBAL },
423 { "match", sMatch, SSHCFG_ALL },
424 { "permitopen", sPermitOpen, SSHCFG_ALL },
425 { "forcecommand", sForceCommand, SSHCFG_ALL },
426 { "chrootdirectory", sChrootDirectory, SSHCFG_ALL },
427 { NULL, sBadOption, 0 }
434 { SSH_TUNMODE_NO, "no" },
435 { SSH_TUNMODE_POINTOPOINT, "point-to-point" },
436 { SSH_TUNMODE_ETHERNET, "ethernet" },
437 { SSH_TUNMODE_YES, "yes" },
442 * Returns the number of the token pointed to by cp or sBadOption.
446 parse_token(const char *cp, const char *filename,
447 int linenum, u_int *flags)
451 for (i = 0; keywords[i].name; i++)
452 if (strcasecmp(cp, keywords[i].name) == 0) {
453 *flags = keywords[i].flags;
454 return keywords[i].opcode;
457 error("%s: line %d: Bad configuration option: %s",
458 filename, linenum, cp);
463 derelativise_path(const char *path)
465 char *expanded, *ret, *cwd;
467 expanded = tilde_expand_filename(path, getuid());
468 if (*expanded == '/')
470 if ((cwd = getcwd(NULL, 0)) == NULL)
471 fatal("%s: getcwd: %s", __func__, strerror(errno));
472 xasprintf(&ret, "%s/%s", cwd, expanded);
479 add_listen_addr(ServerOptions *options, char *addr, int port)
483 if (options->num_ports == 0)
484 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
485 if (options->address_family == -1)
486 options->address_family = AF_UNSPEC;
488 for (i = 0; i < options->num_ports; i++)
489 add_one_listen_addr(options, addr, options->ports[i]);
491 add_one_listen_addr(options, addr, port);
495 add_one_listen_addr(ServerOptions *options, char *addr, int port)
497 struct addrinfo hints, *ai, *aitop;
498 char strport[NI_MAXSERV];
501 memset(&hints, 0, sizeof(hints));
502 hints.ai_family = options->address_family;
503 hints.ai_socktype = SOCK_STREAM;
504 hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
505 snprintf(strport, sizeof strport, "%d", port);
506 if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
507 fatal("bad addr or host: %s (%s)",
508 addr ? addr : "<NULL>",
509 ssh_gai_strerror(gaierr));
510 for (ai = aitop; ai->ai_next; ai = ai->ai_next)
512 ai->ai_next = options->listen_addrs;
513 options->listen_addrs = aitop;
517 * The strategy for the Match blocks is that the config file is parsed twice.
519 * The first time is at startup. activep is initialized to 1 and the
520 * directives in the global context are processed and acted on. Hitting a
521 * Match directive unsets activep and the directives inside the block are
522 * checked for syntax only.
524 * The second time is after a connection has been established but before
525 * authentication. activep is initialized to 2 and global config directives
526 * are ignored since they have already been processed. If the criteria in a
527 * Match block is met, activep is set and the subsequent directives
528 * processed and actioned until EOF or another Match block unsets it. Any
529 * options set are copied into the main server config.
531 * Potential additions/improvements:
532 * - Add Match support for pre-kex directives, eg Protocol, Ciphers.
534 * - Add a Tag directive (idea from David Leonard) ala pf, eg:
535 * Match Address 192.168.0.*
540 * AllowTcpForwarding yes
541 * GatewayPorts clientspecified
544 * - Add a PermittedChannelRequests directive
546 * PermittedChannelRequests session,forwarded-tcpip
550 match_cfg_line_group(const char *grps, int line, const char *user)
558 if ((pw = getpwnam(user)) == NULL) {
559 debug("Can't match group at line %d because user %.100s does "
560 "not exist", line, user);
561 } else if (ga_init(pw->pw_name, pw->pw_gid) == 0) {
562 debug("Can't Match group because user %.100s not in any group "
563 "at line %d", user, line);
564 } else if (ga_match_pattern_list(grps) != 1) {
565 debug("user %.100s does not match group list %.100s at line %d",
568 debug("user %.100s matched group list %.100s at line %d", user,
578 match_cfg_line(char **condition, int line, const char *user, const char *host,
582 char *arg, *attrib, *cp = *condition;
586 debug3("checking syntax for 'Match %s'", cp);
588 debug3("checking match for '%s' user %s host %s addr %s", cp,
589 user ? user : "(null)", host ? host : "(null)",
590 address ? address : "(null)");
592 while ((attrib = strdelim(&cp)) && *attrib != '\0') {
593 if ((arg = strdelim(&cp)) == NULL || *arg == '\0') {
594 error("Missing Match criteria for %s", attrib);
598 if (strcasecmp(attrib, "user") == 0) {
603 if (match_pattern_list(user, arg, len, 0) != 1)
606 debug("user %.100s matched 'User %.100s' at "
607 "line %d", user, arg, line);
608 } else if (strcasecmp(attrib, "group") == 0) {
609 switch (match_cfg_line_group(arg, line, user)) {
615 } else if (strcasecmp(attrib, "host") == 0) {
620 if (match_hostname(host, arg, len) != 1)
623 debug("connection from %.100s matched 'Host "
624 "%.100s' at line %d", host, arg, line);
625 } else if (strcasecmp(attrib, "address") == 0) {
626 switch (addr_match_list(address, arg)) {
628 debug("connection from %.100s matched 'Address "
629 "%.100s' at line %d", address, arg, line);
639 error("Unsupported Match attribute %s", attrib);
644 debug3("match %sfound", result ? "" : "not ");
649 #define WHITESPACE " \t\r\n"
652 process_server_config_line(ServerOptions *options, char *line,
653 const char *filename, int linenum, int *activep, const char *user,
654 const char *host, const char *address)
656 char *cp, **charptr, *arg, *p;
657 int cmdline = 0, *intptr, value, n;
658 SyslogFacility *log_facility_ptr;
659 LogLevel *log_level_ptr;
660 ServerOpCodes opcode;
666 if ((arg = strdelim(&cp)) == NULL)
668 /* Ignore leading whitespace */
671 if (!arg || !*arg || *arg == '#')
675 opcode = parse_token(arg, filename, linenum, &flags);
677 if (activep == NULL) { /* We are processing a command line directive */
681 if (*activep && opcode != sMatch)
682 debug3("%s:%d setting %s %s", filename, linenum, arg, cp);
683 if (*activep == 0 && !(flags & SSHCFG_MATCH)) {
685 fatal("%s line %d: Directive '%s' is not allowed "
686 "within a Match block", filename, linenum, arg);
687 } else { /* this is a directive we have already processed */
695 /* Portable-specific options */
697 intptr = &options->use_pam;
700 /* Standard Options */
704 /* ignore ports from configfile if cmdline specifies ports */
705 if (options->ports_from_cmdline)
707 if (options->listen_addrs != NULL)
708 fatal("%s line %d: ports must be specified before "
709 "ListenAddress.", filename, linenum);
710 if (options->num_ports >= MAX_PORTS)
711 fatal("%s line %d: too many ports.",
714 if (!arg || *arg == '\0')
715 fatal("%s line %d: missing port number.",
717 options->ports[options->num_ports++] = a2port(arg);
718 if (options->ports[options->num_ports-1] <= 0)
719 fatal("%s line %d: Badly formatted port number.",
724 intptr = &options->server_key_bits;
727 if (!arg || *arg == '\0')
728 fatal("%s line %d: missing integer value.",
731 if (*activep && *intptr == -1)
735 case sLoginGraceTime:
736 intptr = &options->login_grace_time;
739 if (!arg || *arg == '\0')
740 fatal("%s line %d: missing time value.",
742 if ((value = convtime(arg)) == -1)
743 fatal("%s line %d: invalid time value.",
749 case sKeyRegenerationTime:
750 intptr = &options->key_regeneration_time;
755 if (arg == NULL || *arg == '\0')
756 fatal("%s line %d: missing address",
758 /* check for bare IPv6 address: no "[]" and 2 or more ":" */
759 if (strchr(arg, '[') == NULL && (p = strchr(arg, ':')) != NULL
760 && strchr(p+1, ':') != NULL) {
761 add_listen_addr(options, arg, 0);
766 fatal("%s line %d: bad address:port usage",
768 p = cleanhostname(p);
771 else if ((port = a2port(arg)) <= 0)
772 fatal("%s line %d: bad port number", filename, linenum);
774 add_listen_addr(options, p, port);
780 if (!arg || *arg == '\0')
781 fatal("%s line %d: missing address family.",
783 intptr = &options->address_family;
784 if (options->listen_addrs != NULL)
785 fatal("%s line %d: address family must be specified before "
786 "ListenAddress.", filename, linenum);
787 if (strcasecmp(arg, "inet") == 0)
789 else if (strcasecmp(arg, "inet6") == 0)
791 else if (strcasecmp(arg, "any") == 0)
794 fatal("%s line %d: unsupported address family \"%s\".",
795 filename, linenum, arg);
801 intptr = &options->num_host_key_files;
802 if (*intptr >= MAX_HOSTKEYS)
803 fatal("%s line %d: too many host keys specified (max %d).",
804 filename, linenum, MAX_HOSTKEYS);
805 charptr = &options->host_key_files[*intptr];
808 if (!arg || *arg == '\0')
809 fatal("%s line %d: missing file name.",
811 if (*activep && *charptr == NULL) {
812 *charptr = derelativise_path(arg);
813 /* increase optional counter */
815 *intptr = *intptr + 1;
820 charptr = &options->pid_file;
823 case sPermitRootLogin:
824 intptr = &options->permit_root_login;
826 if (!arg || *arg == '\0')
827 fatal("%s line %d: missing yes/"
828 "without-password/forced-commands-only/no "
829 "argument.", filename, linenum);
830 value = 0; /* silence compiler */
831 if (strcmp(arg, "without-password") == 0)
832 value = PERMIT_NO_PASSWD;
833 else if (strcmp(arg, "forced-commands-only") == 0)
834 value = PERMIT_FORCED_ONLY;
835 else if (strcmp(arg, "yes") == 0)
837 else if (strcmp(arg, "no") == 0)
840 fatal("%s line %d: Bad yes/"
841 "without-password/forced-commands-only/no "
842 "argument: %s", filename, linenum, arg);
843 if (*activep && *intptr == -1)
848 intptr = &options->ignore_rhosts;
851 if (!arg || *arg == '\0')
852 fatal("%s line %d: missing yes/no argument.",
854 value = 0; /* silence compiler */
855 if (strcmp(arg, "yes") == 0)
857 else if (strcmp(arg, "no") == 0)
860 fatal("%s line %d: Bad yes/no argument: %s",
861 filename, linenum, arg);
862 if (*activep && *intptr == -1)
866 case sIgnoreUserKnownHosts:
867 intptr = &options->ignore_user_known_hosts;
870 case sRhostsRSAAuthentication:
871 intptr = &options->rhosts_rsa_authentication;
874 case sHostbasedAuthentication:
875 intptr = &options->hostbased_authentication;
878 case sHostbasedUsesNameFromPacketOnly:
879 intptr = &options->hostbased_uses_name_from_packet_only;
882 case sRSAAuthentication:
883 intptr = &options->rsa_authentication;
886 case sPubkeyAuthentication:
887 intptr = &options->pubkey_authentication;
890 case sKerberosAuthentication:
891 intptr = &options->kerberos_authentication;
894 case sKerberosOrLocalPasswd:
895 intptr = &options->kerberos_or_local_passwd;
898 case sKerberosTicketCleanup:
899 intptr = &options->kerberos_ticket_cleanup;
902 case sKerberosGetAFSToken:
903 intptr = &options->kerberos_get_afs_token;
906 case sGssAuthentication:
907 intptr = &options->gss_authentication;
910 case sGssCleanupCreds:
911 intptr = &options->gss_cleanup_creds;
914 case sPasswordAuthentication:
915 intptr = &options->password_authentication;
918 case sZeroKnowledgePasswordAuthentication:
919 intptr = &options->zero_knowledge_password_authentication;
922 case sKbdInteractiveAuthentication:
923 intptr = &options->kbd_interactive_authentication;
926 case sChallengeResponseAuthentication:
927 intptr = &options->challenge_response_authentication;
931 intptr = &options->print_motd;
935 intptr = &options->print_lastlog;
939 intptr = &options->x11_forwarding;
942 case sX11DisplayOffset:
943 intptr = &options->x11_display_offset;
946 case sX11UseLocalhost:
947 intptr = &options->x11_use_localhost;
951 charptr = &options->xauth_location;
955 intptr = &options->strict_modes;
959 intptr = &options->tcp_keep_alive;
963 intptr = &options->permit_empty_passwd;
966 case sPermitUserEnvironment:
967 intptr = &options->permit_user_env;
971 intptr = &options->use_login;
975 intptr = &options->compression;
977 if (!arg || *arg == '\0')
978 fatal("%s line %d: missing yes/no/delayed "
979 "argument.", filename, linenum);
980 value = 0; /* silence compiler */
981 if (strcmp(arg, "delayed") == 0)
982 value = COMP_DELAYED;
983 else if (strcmp(arg, "yes") == 0)
985 else if (strcmp(arg, "no") == 0)
988 fatal("%s line %d: Bad yes/no/delayed "
989 "argument: %s", filename, linenum, arg);
995 intptr = &options->gateway_ports;
997 if (!arg || *arg == '\0')
998 fatal("%s line %d: missing yes/no/clientspecified "
999 "argument.", filename, linenum);
1000 value = 0; /* silence compiler */
1001 if (strcmp(arg, "clientspecified") == 0)
1003 else if (strcmp(arg, "yes") == 0)
1005 else if (strcmp(arg, "no") == 0)
1008 fatal("%s line %d: Bad yes/no/clientspecified "
1009 "argument: %s", filename, linenum, arg);
1010 if (*activep && *intptr == -1)
1015 intptr = &options->use_dns;
1019 log_facility_ptr = &options->log_facility;
1020 arg = strdelim(&cp);
1021 value = log_facility_number(arg);
1022 if (value == SYSLOG_FACILITY_NOT_SET)
1023 fatal("%.200s line %d: unsupported log facility '%s'",
1024 filename, linenum, arg ? arg : "<NONE>");
1025 if (*log_facility_ptr == -1)
1026 *log_facility_ptr = (SyslogFacility) value;
1030 log_level_ptr = &options->log_level;
1031 arg = strdelim(&cp);
1032 value = log_level_number(arg);
1033 if (value == SYSLOG_LEVEL_NOT_SET)
1034 fatal("%.200s line %d: unsupported log level '%s'",
1035 filename, linenum, arg ? arg : "<NONE>");
1036 if (*log_level_ptr == -1)
1037 *log_level_ptr = (LogLevel) value;
1040 case sAllowTcpForwarding:
1041 intptr = &options->allow_tcp_forwarding;
1044 case sAllowAgentForwarding:
1045 intptr = &options->allow_agent_forwarding;
1048 case sUsePrivilegeSeparation:
1049 intptr = &use_privsep;
1053 while ((arg = strdelim(&cp)) && *arg != '\0') {
1054 if (options->num_allow_users >= MAX_ALLOW_USERS)
1055 fatal("%s line %d: too many allow users.",
1057 options->allow_users[options->num_allow_users++] =
1063 while ((arg = strdelim(&cp)) && *arg != '\0') {
1064 if (options->num_deny_users >= MAX_DENY_USERS)
1065 fatal("%s line %d: too many deny users.",
1067 options->deny_users[options->num_deny_users++] =
1073 while ((arg = strdelim(&cp)) && *arg != '\0') {
1074 if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
1075 fatal("%s line %d: too many allow groups.",
1077 options->allow_groups[options->num_allow_groups++] =
1083 while ((arg = strdelim(&cp)) && *arg != '\0') {
1084 if (options->num_deny_groups >= MAX_DENY_GROUPS)
1085 fatal("%s line %d: too many deny groups.",
1087 options->deny_groups[options->num_deny_groups++] = xstrdup(arg);
1092 arg = strdelim(&cp);
1093 if (!arg || *arg == '\0')
1094 fatal("%s line %d: Missing argument.", filename, linenum);
1095 if (!ciphers_valid(arg))
1096 fatal("%s line %d: Bad SSH2 cipher spec '%s'.",
1097 filename, linenum, arg ? arg : "<NONE>");
1098 if (options->ciphers == NULL)
1099 options->ciphers = xstrdup(arg);
1103 arg = strdelim(&cp);
1104 if (!arg || *arg == '\0')
1105 fatal("%s line %d: Missing argument.", filename, linenum);
1106 if (!mac_valid(arg))
1107 fatal("%s line %d: Bad SSH2 mac spec '%s'.",
1108 filename, linenum, arg ? arg : "<NONE>");
1109 if (options->macs == NULL)
1110 options->macs = xstrdup(arg);
1114 intptr = &options->protocol;
1115 arg = strdelim(&cp);
1116 if (!arg || *arg == '\0')
1117 fatal("%s line %d: Missing argument.", filename, linenum);
1118 value = proto_spec(arg);
1119 if (value == SSH_PROTO_UNKNOWN)
1120 fatal("%s line %d: Bad protocol spec '%s'.",
1121 filename, linenum, arg ? arg : "<NONE>");
1122 if (*intptr == SSH_PROTO_UNKNOWN)
1127 if (options->num_subsystems >= MAX_SUBSYSTEMS) {
1128 fatal("%s line %d: too many subsystems defined.",
1131 arg = strdelim(&cp);
1132 if (!arg || *arg == '\0')
1133 fatal("%s line %d: Missing subsystem name.",
1136 arg = strdelim(&cp);
1139 for (i = 0; i < options->num_subsystems; i++)
1140 if (strcmp(arg, options->subsystem_name[i]) == 0)
1141 fatal("%s line %d: Subsystem '%s' already defined.",
1142 filename, linenum, arg);
1143 options->subsystem_name[options->num_subsystems] = xstrdup(arg);
1144 arg = strdelim(&cp);
1145 if (!arg || *arg == '\0')
1146 fatal("%s line %d: Missing subsystem command.",
1148 options->subsystem_command[options->num_subsystems] = xstrdup(arg);
1150 /* Collect arguments (separate to executable) */
1152 len = strlen(p) + 1;
1153 while ((arg = strdelim(&cp)) != NULL && *arg != '\0') {
1154 len += 1 + strlen(arg);
1155 p = xrealloc(p, 1, len);
1156 strlcat(p, " ", len);
1157 strlcat(p, arg, len);
1159 options->subsystem_args[options->num_subsystems] = p;
1160 options->num_subsystems++;
1164 arg = strdelim(&cp);
1165 if (!arg || *arg == '\0')
1166 fatal("%s line %d: Missing MaxStartups spec.",
1168 if ((n = sscanf(arg, "%d:%d:%d",
1169 &options->max_startups_begin,
1170 &options->max_startups_rate,
1171 &options->max_startups)) == 3) {
1172 if (options->max_startups_begin >
1173 options->max_startups ||
1174 options->max_startups_rate > 100 ||
1175 options->max_startups_rate < 1)
1176 fatal("%s line %d: Illegal MaxStartups spec.",
1179 fatal("%s line %d: Illegal MaxStartups spec.",
1182 options->max_startups = options->max_startups_begin;
1186 intptr = &options->max_authtries;
1190 intptr = &options->max_sessions;
1194 charptr = &options->banner;
1195 goto parse_filename;
1198 * These options can contain %X options expanded at
1199 * connect time, so that you can specify paths like:
1201 * AuthorizedKeysFile /etc/ssh_keys/%u
1203 case sAuthorizedKeysFile:
1204 case sAuthorizedKeysFile2:
1205 charptr = (opcode == sAuthorizedKeysFile) ?
1206 &options->authorized_keys_file :
1207 &options->authorized_keys_file2;
1208 goto parse_filename;
1210 case sClientAliveInterval:
1211 intptr = &options->client_alive_interval;
1214 case sClientAliveCountMax:
1215 intptr = &options->client_alive_count_max;
1219 while ((arg = strdelim(&cp)) && *arg != '\0') {
1220 if (strchr(arg, '=') != NULL)
1221 fatal("%s line %d: Invalid environment name.",
1223 if (options->num_accept_env >= MAX_ACCEPT_ENV)
1224 fatal("%s line %d: too many allow env.",
1228 options->accept_env[options->num_accept_env++] =
1234 intptr = &options->permit_tun;
1235 arg = strdelim(&cp);
1236 if (!arg || *arg == '\0')
1237 fatal("%s line %d: Missing yes/point-to-point/"
1238 "ethernet/no argument.", filename, linenum);
1240 for (i = 0; tunmode_desc[i].val != -1; i++)
1241 if (strcmp(tunmode_desc[i].text, arg) == 0) {
1242 value = tunmode_desc[i].val;
1246 fatal("%s line %d: Bad yes/point-to-point/ethernet/"
1247 "no argument: %s", filename, linenum, arg);
1254 fatal("Match directive not supported as a command-line "
1256 value = match_cfg_line(&cp, linenum, user, host, address);
1258 fatal("%s line %d: Bad Match condition", filename,
1264 arg = strdelim(&cp);
1265 if (!arg || *arg == '\0')
1266 fatal("%s line %d: missing PermitOpen specification",
1268 n = options->num_permitted_opens; /* modified later */
1269 if (strcmp(arg, "any") == 0) {
1270 if (*activep && n == -1) {
1271 channel_clear_adm_permitted_opens();
1272 options->num_permitted_opens = 0;
1276 if (*activep && n == -1)
1277 channel_clear_adm_permitted_opens();
1278 for (; arg != NULL && *arg != '\0'; arg = strdelim(&cp)) {
1281 fatal("%s line %d: missing host in PermitOpen",
1283 p = cleanhostname(p);
1284 if (arg == NULL || (port = a2port(arg)) <= 0)
1285 fatal("%s line %d: bad port number in "
1286 "PermitOpen", filename, linenum);
1287 if (*activep && n == -1)
1288 options->num_permitted_opens =
1289 channel_add_adm_permitted_opens(p, port);
1295 fatal("%.200s line %d: Missing argument.", filename,
1297 len = strspn(cp, WHITESPACE);
1298 if (*activep && options->adm_forced_command == NULL)
1299 options->adm_forced_command = xstrdup(cp + len);
1302 case sChrootDirectory:
1303 charptr = &options->chroot_directory;
1305 arg = strdelim(&cp);
1306 if (!arg || *arg == '\0')
1307 fatal("%s line %d: missing file name.",
1309 if (*activep && *charptr == NULL)
1310 *charptr = xstrdup(arg);
1314 logit("%s line %d: Deprecated option %s",
1315 filename, linenum, arg);
1317 arg = strdelim(&cp);
1321 logit("%s line %d: Unsupported option %s",
1322 filename, linenum, arg);
1324 arg = strdelim(&cp);
1328 fatal("%s line %d: Missing handler for opcode %s (%d)",
1329 filename, linenum, arg, opcode);
1331 if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
1332 fatal("%s line %d: garbage at end of line; \"%.200s\".",
1333 filename, linenum, arg);
1337 /* Reads the server configuration file. */
1340 load_server_config(const char *filename, Buffer *conf)
1342 char line[1024], *cp;
1345 debug2("%s: filename %s", __func__, filename);
1346 if ((f = fopen(filename, "r")) == NULL) {
1351 while (fgets(line, sizeof(line), f)) {
1353 * Trim out comments and strip whitespace
1354 * NB - preserve newlines, they are needed to reproduce
1355 * line numbers later for error messages
1357 if ((cp = strchr(line, '#')) != NULL)
1358 memcpy(cp, "\n", 2);
1359 cp = line + strspn(line, " \t\r");
1361 buffer_append(conf, cp, strlen(cp));
1363 buffer_append(conf, "\0", 1);
1365 debug2("%s: done config len = %d", __func__, buffer_len(conf));
1369 parse_server_match_config(ServerOptions *options, const char *user,
1370 const char *host, const char *address)
1374 initialize_server_options(&mo);
1375 parse_server_config(&mo, "reprocess config", &cfg, user, host, address);
1376 copy_set_server_options(options, &mo, 0);
1380 #define M_CP_INTOPT(n) do {\
1384 #define M_CP_STROPT(n) do {\
1385 if (src->n != NULL) { \
1386 if (dst->n != NULL) \
1393 * Copy any supported values that are set.
1395 * If the preauth flag is set, we do not bother copying the string or
1396 * array values that are not used pre-authentication, because any that we
1397 * do use must be explictly sent in mm_getpwnamallow().
1400 copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
1402 M_CP_INTOPT(password_authentication);
1403 M_CP_INTOPT(gss_authentication);
1404 M_CP_INTOPT(rsa_authentication);
1405 M_CP_INTOPT(pubkey_authentication);
1406 M_CP_INTOPT(kerberos_authentication);
1407 M_CP_INTOPT(hostbased_authentication);
1408 M_CP_INTOPT(kbd_interactive_authentication);
1409 M_CP_INTOPT(zero_knowledge_password_authentication);
1410 M_CP_INTOPT(permit_root_login);
1411 M_CP_INTOPT(permit_empty_passwd);
1413 M_CP_INTOPT(allow_tcp_forwarding);
1414 M_CP_INTOPT(allow_agent_forwarding);
1415 M_CP_INTOPT(gateway_ports);
1416 M_CP_INTOPT(x11_display_offset);
1417 M_CP_INTOPT(x11_forwarding);
1418 M_CP_INTOPT(x11_use_localhost);
1419 M_CP_INTOPT(max_sessions);
1420 M_CP_INTOPT(max_authtries);
1422 M_CP_STROPT(banner);
1425 M_CP_STROPT(adm_forced_command);
1426 M_CP_STROPT(chroot_directory);
1433 parse_server_config(ServerOptions *options, const char *filename, Buffer *conf,
1434 const char *user, const char *host, const char *address)
1436 int active, linenum, bad_options = 0;
1437 char *cp, *obuf, *cbuf;
1439 debug2("%s: config %s len %d", __func__, filename, buffer_len(conf));
1441 obuf = cbuf = xstrdup(buffer_ptr(conf));
1442 active = user ? 0 : 1;
1444 while ((cp = strsep(&cbuf, "\n")) != NULL) {
1445 if (process_server_config_line(options, cp, filename,
1446 linenum++, &active, user, host, address) != 0)
1450 if (bad_options > 0)
1451 fatal("%s: terminating, %d bad configuration options",
1452 filename, bad_options);
1456 fmt_intarg(ServerOpCodes code, int val)
1458 if (code == sAddressFamily) {
1470 if (code == sPermitRootLogin) {
1472 case PERMIT_NO_PASSWD:
1473 return "without-password";
1474 case PERMIT_FORCED_ONLY:
1475 return "forced-commands-only";
1480 if (code == sProtocol) {
1486 case (SSH_PROTO_1|SSH_PROTO_2):
1492 if (code == sGatewayPorts && val == 2)
1493 return "clientspecified";
1494 if (code == sCompression && val == COMP_DELAYED)
1508 lookup_opcode_name(ServerOpCodes code)
1512 for (i = 0; keywords[i].name != NULL; i++)
1513 if (keywords[i].opcode == code)
1514 return(keywords[i].name);
1519 dump_cfg_int(ServerOpCodes code, int val)
1521 printf("%s %d\n", lookup_opcode_name(code), val);
1525 dump_cfg_fmtint(ServerOpCodes code, int val)
1527 printf("%s %s\n", lookup_opcode_name(code), fmt_intarg(code, val));
1531 dump_cfg_string(ServerOpCodes code, const char *val)
1535 printf("%s %s\n", lookup_opcode_name(code), val);
1539 dump_cfg_strarray(ServerOpCodes code, u_int count, char **vals)
1543 for (i = 0; i < count; i++)
1544 printf("%s %s\n", lookup_opcode_name(code), vals[i]);
1548 dump_config(ServerOptions *o)
1552 struct addrinfo *ai;
1553 char addr[NI_MAXHOST], port[NI_MAXSERV], *s = NULL;
1555 /* these are usually at the top of the config */
1556 for (i = 0; i < o->num_ports; i++)
1557 printf("port %d\n", o->ports[i]);
1558 dump_cfg_fmtint(sProtocol, o->protocol);
1559 dump_cfg_fmtint(sAddressFamily, o->address_family);
1561 /* ListenAddress must be after Port */
1562 for (ai = o->listen_addrs; ai; ai = ai->ai_next) {
1563 if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen, addr,
1564 sizeof(addr), port, sizeof(port),
1565 NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
1566 error("getnameinfo failed: %.100s",
1567 (ret != EAI_SYSTEM) ? gai_strerror(ret) :
1570 if (ai->ai_family == AF_INET6)
1571 printf("listenaddress [%s]:%s\n", addr, port);
1573 printf("listenaddress %s:%s\n", addr, port);
1577 /* integer arguments */
1579 dump_cfg_int(sUsePAM, o->use_pam);
1581 dump_cfg_int(sServerKeyBits, o->server_key_bits);
1582 dump_cfg_int(sLoginGraceTime, o->login_grace_time);
1583 dump_cfg_int(sKeyRegenerationTime, o->key_regeneration_time);
1584 dump_cfg_int(sX11DisplayOffset, o->x11_display_offset);
1585 dump_cfg_int(sMaxAuthTries, o->max_authtries);
1586 dump_cfg_int(sMaxSessions, o->max_sessions);
1587 dump_cfg_int(sClientAliveInterval, o->client_alive_interval);
1588 dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max);
1590 /* formatted integer arguments */
1591 dump_cfg_fmtint(sPermitRootLogin, o->permit_root_login);
1592 dump_cfg_fmtint(sIgnoreRhosts, o->ignore_rhosts);
1593 dump_cfg_fmtint(sIgnoreUserKnownHosts, o->ignore_user_known_hosts);
1594 dump_cfg_fmtint(sRhostsRSAAuthentication, o->rhosts_rsa_authentication);
1595 dump_cfg_fmtint(sHostbasedAuthentication, o->hostbased_authentication);
1596 dump_cfg_fmtint(sHostbasedUsesNameFromPacketOnly,
1597 o->hostbased_uses_name_from_packet_only);
1598 dump_cfg_fmtint(sRSAAuthentication, o->rsa_authentication);
1599 dump_cfg_fmtint(sPubkeyAuthentication, o->pubkey_authentication);
1601 dump_cfg_fmtint(sKerberosAuthentication, o->kerberos_authentication);
1602 dump_cfg_fmtint(sKerberosOrLocalPasswd, o->kerberos_or_local_passwd);
1603 dump_cfg_fmtint(sKerberosTicketCleanup, o->kerberos_ticket_cleanup);
1605 dump_cfg_fmtint(sKerberosGetAFSToken, o->kerberos_get_afs_token);
1609 dump_cfg_fmtint(sGssAuthentication, o->gss_authentication);
1610 dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds);
1613 dump_cfg_fmtint(sZeroKnowledgePasswordAuthentication,
1614 o->zero_knowledge_password_authentication);
1616 dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication);
1617 dump_cfg_fmtint(sKbdInteractiveAuthentication,
1618 o->kbd_interactive_authentication);
1619 dump_cfg_fmtint(sChallengeResponseAuthentication,
1620 o->challenge_response_authentication);
1621 dump_cfg_fmtint(sPrintMotd, o->print_motd);
1622 dump_cfg_fmtint(sPrintLastLog, o->print_lastlog);
1623 dump_cfg_fmtint(sX11Forwarding, o->x11_forwarding);
1624 dump_cfg_fmtint(sX11UseLocalhost, o->x11_use_localhost);
1625 dump_cfg_fmtint(sStrictModes, o->strict_modes);
1626 dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive);
1627 dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd);
1628 dump_cfg_fmtint(sPermitUserEnvironment, o->permit_user_env);
1629 dump_cfg_fmtint(sUseLogin, o->use_login);
1630 dump_cfg_fmtint(sCompression, o->compression);
1631 dump_cfg_fmtint(sGatewayPorts, o->gateway_ports);
1632 dump_cfg_fmtint(sUseDNS, o->use_dns);
1633 dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding);
1634 dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep);
1636 /* string arguments */
1637 dump_cfg_string(sPidFile, o->pid_file);
1638 dump_cfg_string(sXAuthLocation, o->xauth_location);
1639 dump_cfg_string(sCiphers, o->ciphers);
1640 dump_cfg_string(sMacs, o->macs);
1641 dump_cfg_string(sBanner, o->banner);
1642 dump_cfg_string(sAuthorizedKeysFile, o->authorized_keys_file);
1643 dump_cfg_string(sAuthorizedKeysFile2, o->authorized_keys_file2);
1644 dump_cfg_string(sForceCommand, o->adm_forced_command);
1645 dump_cfg_string(sChrootDirectory, o->chroot_directory);
1647 /* string arguments requiring a lookup */
1648 dump_cfg_string(sLogLevel, log_level_name(o->log_level));
1649 dump_cfg_string(sLogFacility, log_facility_name(o->log_facility));
1651 /* string array arguments */
1652 dump_cfg_strarray(sHostKeyFile, o->num_host_key_files,
1654 dump_cfg_strarray(sAllowUsers, o->num_allow_users, o->allow_users);
1655 dump_cfg_strarray(sDenyUsers, o->num_deny_users, o->deny_users);
1656 dump_cfg_strarray(sAllowGroups, o->num_allow_groups, o->allow_groups);
1657 dump_cfg_strarray(sDenyGroups, o->num_deny_groups, o->deny_groups);
1658 dump_cfg_strarray(sAcceptEnv, o->num_accept_env, o->accept_env);
1660 /* other arguments */
1661 for (i = 0; i < o->num_subsystems; i++)
1662 printf("subsystem %s %s\n", o->subsystem_name[i],
1663 o->subsystem_args[i]);
1665 printf("maxstartups %d:%d:%d\n", o->max_startups_begin,
1666 o->max_startups_rate, o->max_startups);
1668 for (i = 0; tunmode_desc[i].val != -1; i++)
1669 if (tunmode_desc[i].val == o->permit_tun) {
1670 s = tunmode_desc[i].text;
1673 dump_cfg_string(sPermitTunnel, s);
1675 channel_print_adm_permitted_opens();