⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servconf.c

📁 OpenSSL Source code for SFTP, SSH, and many others
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland *                    All rights reserved * * As far as I am concerned, the code I have written for this software * can be used freely for any purpose.  Any derived versions of this * software must be clearly marked as such, and if the derived work is * incompatible with the protocol description in the RFC file, it must be * called by a name other than "ssh" or "Secure Shell". */#include "includes.h"RCSID("$OpenBSD: servconf.c,v 1.111 2002/06/20 23:05:55 markus Exp $");#if defined(KRB4)#include <krb.h>#endif#if defined(KRB5)#ifdef HEIMDAL#include <krb.h>#else/* Bodge - but then, so is using the kerberos IV KEYFILE to get a Kerberos V * keytab */#define KEYFILE "/etc/krb5.keytab"#endif#endif#ifdef AFS#include <kafs.h>#endif#include "ssh.h"#include "log.h"#include "servconf.h"#include "xmalloc.h"#include "compat.h"#include "pathnames.h"#include "tildexpand.h"#include "misc.h"#include "cipher.h"#include "kex.h"#include "mac.h"static void add_listen_addr(ServerOptions *, char *, u_short);static void add_one_listen_addr(ServerOptions *, char *, u_short);/* AF_UNSPEC or AF_INET or AF_INET6 */extern int IPv4or6;/* Use of privilege separation or not */extern int use_privsep;/* Initializes the server options to their default values. */voidinitialize_server_options(ServerOptions *options){	memset(options, 0, sizeof(*options));	/* Portable-specific options */	options->pam_authentication_via_kbd_int = -1;	/* Standard Options */	options->num_ports = 0;	options->ports_from_cmdline = 0;	options->listen_addrs = NULL;	options->num_host_key_files = 0;	options->pid_file = NULL;	options->server_key_bits = -1;	options->login_grace_time = -1;	options->key_regeneration_time = -1;	options->permit_root_login = PERMIT_NOT_SET;	options->ignore_rhosts = -1;	options->ignore_user_known_hosts = -1;	options->print_motd = -1;	options->print_lastlog = -1;	options->x11_forwarding = -1;	options->x11_display_offset = -1;	options->x11_use_localhost = -1;	options->xauth_location = NULL;	options->strict_modes = -1;	options->keepalives = -1;	options->log_facility = SYSLOG_FACILITY_NOT_SET;	options->log_level = SYSLOG_LEVEL_NOT_SET;	options->rhosts_authentication = -1;	options->rhosts_rsa_authentication = -1;	options->hostbased_authentication = -1;	options->hostbased_uses_name_from_packet_only = -1;	options->rsa_authentication = -1;	options->pubkey_authentication = -1;#if defined(KRB4) || defined(KRB5)	options->kerberos_authentication = -1;	options->kerberos_or_local_passwd = -1;	options->kerberos_ticket_cleanup = -1;#endif#if defined(AFS) || defined(KRB5)	options->kerberos_tgt_passing = -1;#endif#ifdef AFS	options->afs_token_passing = -1;#endif	options->password_authentication = -1;	options->kbd_interactive_authentication = -1;	options->challenge_response_authentication = -1;	options->permit_empty_passwd = -1;	options->use_login = -1;	options->compression = -1;	options->allow_tcp_forwarding = -1;	options->num_allow_users = 0;	options->num_deny_users = 0;	options->num_allow_groups = 0;	options->num_deny_groups = 0;	options->ciphers = NULL;	options->macs = NULL;	options->protocol = SSH_PROTO_UNKNOWN;	options->gateway_ports = -1;	options->num_subsystems = 0;	options->max_startups_begin = -1;	options->max_startups_rate = -1;	options->max_startups = -1;	options->banner = NULL;	options->verify_reverse_mapping = -1;	options->client_alive_interval = -1;	options->client_alive_count_max = -1;	options->authorized_keys_file = NULL;	options->authorized_keys_file2 = NULL;	/* Needs to be accessable in many places */	use_privsep = -1;}voidfill_default_server_options(ServerOptions *options){	/* Portable-specific options */	if (options->pam_authentication_via_kbd_int == -1)		options->pam_authentication_via_kbd_int = 0;	/* Standard Options */	if (options->protocol == SSH_PROTO_UNKNOWN)		options->protocol = SSH_PROTO_1|SSH_PROTO_2;	if (options->num_host_key_files == 0) {		/* fill default hostkeys for protocols */		if (options->protocol & SSH_PROTO_1)			options->host_key_files[options->num_host_key_files++] =			    _PATH_HOST_KEY_FILE;		if (options->protocol & SSH_PROTO_2) {			options->host_key_files[options->num_host_key_files++] =			    _PATH_HOST_RSA_KEY_FILE;			options->host_key_files[options->num_host_key_files++] =			    _PATH_HOST_DSA_KEY_FILE;		}	}	if (options->num_ports == 0)		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;	if (options->listen_addrs == NULL)		add_listen_addr(options, NULL, 0);	if (options->pid_file == NULL)		options->pid_file = _PATH_SSH_DAEMON_PID_FILE;	if (options->server_key_bits == -1)		options->server_key_bits = 768;	if (options->login_grace_time == -1)		options->login_grace_time = 600;	if (options->key_regeneration_time == -1)		options->key_regeneration_time = 3600;	if (options->permit_root_login == PERMIT_NOT_SET)		options->permit_root_login = PERMIT_YES;	if (options->ignore_rhosts == -1)		options->ignore_rhosts = 1;	if (options->ignore_user_known_hosts == -1)		options->ignore_user_known_hosts = 0;	if (options->print_motd == -1)		options->print_motd = 1;	if (options->print_lastlog == -1)		options->print_lastlog = 1;	if (options->x11_forwarding == -1)		options->x11_forwarding = 0;	if (options->x11_display_offset == -1)		options->x11_display_offset = 10;	if (options->x11_use_localhost == -1)		options->x11_use_localhost = 1;	if (options->xauth_location == NULL)		options->xauth_location = _PATH_XAUTH;	if (options->strict_modes == -1)		options->strict_modes = 1;	if (options->keepalives == -1)		options->keepalives = 1;	if (options->log_facility == SYSLOG_FACILITY_NOT_SET)		options->log_facility = SYSLOG_FACILITY_AUTH;	if (options->log_level == SYSLOG_LEVEL_NOT_SET)		options->log_level = SYSLOG_LEVEL_INFO;	if (options->rhosts_authentication == -1)		options->rhosts_authentication = 0;	if (options->rhosts_rsa_authentication == -1)		options->rhosts_rsa_authentication = 0;	if (options->hostbased_authentication == -1)		options->hostbased_authentication = 0;	if (options->hostbased_uses_name_from_packet_only == -1)		options->hostbased_uses_name_from_packet_only = 0;	if (options->rsa_authentication == -1)		options->rsa_authentication = 1;	if (options->pubkey_authentication == -1)		options->pubkey_authentication = 1;#if defined(KRB4) || defined(KRB5)	if (options->kerberos_authentication == -1)		options->kerberos_authentication = 0;	if (options->kerberos_or_local_passwd == -1)		options->kerberos_or_local_passwd = 1;	if (options->kerberos_ticket_cleanup == -1)		options->kerberos_ticket_cleanup = 1;#endif#if defined(AFS) || defined(KRB5)	if (options->kerberos_tgt_passing == -1)		options->kerberos_tgt_passing = 0;#endif#ifdef AFS	if (options->afs_token_passing == -1)		options->afs_token_passing = 0;#endif	if (options->password_authentication == -1)		options->password_authentication = 1;	if (options->kbd_interactive_authentication == -1)		options->kbd_interactive_authentication = 0;	if (options->challenge_response_authentication == -1)		options->challenge_response_authentication = 1;	if (options->permit_empty_passwd == -1)		options->permit_empty_passwd = 0;	if (options->use_login == -1)		options->use_login = 0;	if (options->compression == -1)		options->compression = 1;	if (options->allow_tcp_forwarding == -1)		options->allow_tcp_forwarding = 1;	if (options->gateway_ports == -1)		options->gateway_ports = 0;	if (options->max_startups == -1)		options->max_startups = 10;	if (options->max_startups_rate == -1)		options->max_startups_rate = 100;		/* 100% */	if (options->max_startups_begin == -1)		options->max_startups_begin = options->max_startups;	if (options->verify_reverse_mapping == -1)		options->verify_reverse_mapping = 0;	if (options->client_alive_interval == -1)		options->client_alive_interval = 0;	if (options->client_alive_count_max == -1)		options->client_alive_count_max = 3;	if (options->authorized_keys_file2 == NULL) {		/* authorized_keys_file2 falls back to authorized_keys_file */		if (options->authorized_keys_file != NULL)			options->authorized_keys_file2 = options->authorized_keys_file;		else			options->authorized_keys_file2 = _PATH_SSH_USER_PERMITTED_KEYS2;	}	if (options->authorized_keys_file == NULL)		options->authorized_keys_file = _PATH_SSH_USER_PERMITTED_KEYS;	/* Turn privilege separation on by default */	if (use_privsep == -1)		use_privsep = 1;#if !defined(HAVE_MMAP) || !defined(MAP_ANON)	if (use_privsep && options->compression == 1) {		error("This platform does not support both privilege "		    "separation and compression");		error("Compression disabled");		options->compression = 0;	}#endif}/* Keyword tokens. */typedef enum {	sBadOption,		/* == unknown option */	/* Portable-specific options */	sPAMAuthenticationViaKbdInt,	/* Standard Options */	sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,	sPermitRootLogin, sLogFacility, sLogLevel,	sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication,#if defined(KRB4) || defined(KRB5)	sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,#endif#if defined(AFS) || defined(KRB5)	sKerberosTgtPassing,#endif#ifdef AFS	sAFSTokenPassing,#endif	sChallengeResponseAuthentication,	sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,	sPrintMotd, sPrintLastLog, sIgnoreRhosts,	sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,	sStrictModes, sEmptyPasswd, sKeepAlives,	sUseLogin, sAllowTcpForwarding, sCompression,	sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,	sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,	sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, sMaxStartups,	sBanner, sVerifyReverseMapping, sHostbasedAuthentication,	sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,	sClientAliveCountMax, sAuthorizedKeysFile, sAuthorizedKeysFile2,	sUsePrivilegeSeparation,	sDeprecated} ServerOpCodes;/* Textual representation of the tokens. */static struct {	const char *name;	ServerOpCodes opcode;} keywords[] = {	/* Portable-specific options */	{ "PAMAuthenticationViaKbdInt", sPAMAuthenticationViaKbdInt },	/* Standard Options */	{ "port", sPort },	{ "hostkey", sHostKeyFile },	{ "hostdsakey", sHostKeyFile },					/* alias */	{ "pidfile", sPidFile },	{ "serverkeybits", sServerKeyBits },	{ "logingracetime", sLoginGraceTime },	{ "keyregenerationinterval", sKeyRegenerationTime },	{ "permitrootlogin", sPermitRootLogin },	{ "syslogfacility", sLogFacility },	{ "loglevel", sLogLevel },	{ "rhostsauthentication", sRhostsAuthentication },	{ "rhostsrsaauthentication", sRhostsRSAAuthentication },	{ "hostbasedauthentication", sHostbasedAuthentication },	{ "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly },	{ "rsaauthentication", sRSAAuthentication },	{ "pubkeyauthentication", sPubkeyAuthentication },	{ "dsaauthentication", sPubkeyAuthentication },			/* alias */#if defined(KRB4) || defined(KRB5)	{ "kerberosauthentication", sKerberosAuthentication },	{ "kerberosorlocalpasswd", sKerberosOrLocalPasswd },	{ "kerberosticketcleanup", sKerberosTicketCleanup },#endif#if defined(AFS) || defined(KRB5)	{ "kerberostgtpassing", sKerberosTgtPassing },#endif#ifdef AFS	{ "afstokenpassing", sAFSTokenPassing },#endif	{ "passwordauthentication", sPasswordAuthentication },	{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication },	{ "challengeresponseauthentication", sChallengeResponseAuthentication },	{ "skeyauthentication", sChallengeResponseAuthentication }, /* alias */	{ "checkmail", sDeprecated },	{ "listenaddress", sListenAddress },	{ "printmotd", sPrintMotd },	{ "printlastlog", sPrintLastLog },	{ "ignorerhosts", sIgnoreRhosts },	{ "ignoreuserknownhosts", sIgnoreUserKnownHosts },	{ "x11forwarding", sX11Forwarding },	{ "x11displayoffset", sX11DisplayOffset },	{ "x11uselocalhost", sX11UseLocalhost },	{ "xauthlocation", sXAuthLocation },	{ "strictmodes", sStrictModes },	{ "permitemptypasswords", sEmptyPasswd },	{ "uselogin", sUseLogin },	{ "compression", sCompression },	{ "keepalive", sKeepAlives },	{ "allowtcpforwarding", sAllowTcpForwarding },	{ "allowusers", sAllowUsers },	{ "denyusers", sDenyUsers },	{ "allowgroups", sAllowGroups },	{ "denygroups", sDenyGroups },	{ "ciphers", sCiphers },	{ "macs", sMacs },	{ "protocol", sProtocol },	{ "gatewayports", sGatewayPorts },	{ "subsystem", sSubsystem },	{ "maxstartups", sMaxStartups },	{ "banner", sBanner },	{ "verifyreversemapping", sVerifyReverseMapping },	{ "reversemappingcheck", sVerifyReverseMapping },	{ "clientaliveinterval", sClientAliveInterval },	{ "clientalivecountmax", sClientAliveCountMax },	{ "authorizedkeysfile", sAuthorizedKeysFile },	{ "authorizedkeysfile2", sAuthorizedKeysFile2 },	{ "useprivilegeseparation", sUsePrivilegeSeparation},	{ NULL, sBadOption }};/* * Returns the number of the token pointed to by cp or sBadOption. */static ServerOpCodesparse_token(const char *cp, const char *filename,	    int linenum){	u_int i;	for (i = 0; keywords[i].name; i++)		if (strcasecmp(cp, keywords[i].name) == 0)			return keywords[i].opcode;	error("%s: line %d: Bad configuration option: %s",	    filename, linenum, cp);	return sBadOption;}static voidadd_listen_addr(ServerOptions *options, char *addr, u_short port){	int i;	if (options->num_ports == 0)		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;	if (port == 0)		for (i = 0; i < options->num_ports; i++)			add_one_listen_addr(options, addr, options->ports[i]);	else		add_one_listen_addr(options, addr, port);}static voidadd_one_listen_addr(ServerOptions *options, char *addr, u_short port){	struct addrinfo hints, *ai, *aitop;	char strport[NI_MAXSERV];	int gaierr;	memset(&hints, 0, sizeof(hints));	hints.ai_family = IPv4or6;	hints.ai_socktype = SOCK_STREAM;	hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;	snprintf(strport, sizeof strport, "%d", port);	if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)		fatal("bad addr or host: %s (%s)",		    addr ? addr : "<NULL>",		    gai_strerror(gaierr));	for (ai = aitop; ai->ai_next; ai = ai->ai_next)		;	ai->ai_next = options->listen_addrs;	options->listen_addrs = aitop;}intprocess_server_config_line(ServerOptions *options, char *line,    const char *filename, int linenum){	char *cp, **charptr, *arg, *p;	int *intptr, value;	ServerOpCodes opcode;	int i, n;	cp = line;	arg = strdelim(&cp);	/* Ignore leading whitespace */	if (*arg == '\0')		arg = strdelim(&cp);	if (!arg || !*arg || *arg == '#')		return 0;	intptr = NULL;	charptr = NULL;	opcode = parse_token(arg, filename, linenum);	switch (opcode) {	/* Portable-specific options */	case sPAMAuthenticationViaKbdInt:		intptr = &options->pam_authentication_via_kbd_int;		goto parse_flag;	/* Standard Options */	case sBadOption:		return -1;	case sPort:		/* ignore ports from configfile if cmdline specifies ports */		if (options->ports_from_cmdline)			return 0;		if (options->listen_addrs != NULL)			fatal("%s line %d: ports must be specified before "			    "ListenAddress.", filename, linenum);		if (options->num_ports >= MAX_PORTS)			fatal("%s line %d: too many ports.",

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -