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