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

📄 servconf.c

📁 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持
💻 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.139 2005/03/01 10:09:52 djm Exp $");#include "ssh.h"#include "log.h"#include "servconf.h"#include "xmalloc.h"#include "compat.h"#include "pathnames.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);/* 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->use_pam = -1;	/* Standard Options */	options->num_ports = 0;	options->ports_from_cmdline = 0;	options->listen_addrs = NULL;	options->address_family = -1;	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->tcp_keep_alive = -1;	options->log_facility = SYSLOG_FACILITY_NOT_SET;	options->log_level = SYSLOG_LEVEL_NOT_SET;	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;	options->kerberos_authentication = -1;	options->kerberos_or_local_passwd = -1;	options->kerberos_ticket_cleanup = -1;	options->kerberos_get_afs_token = -1;	options->gss_authentication=-1;	options->gss_cleanup_creds = -1;	options->password_authentication = -1;	options->kbd_interactive_authentication = -1;	options->challenge_response_authentication = -1;	options->permit_empty_passwd = -1;	options->permit_user_env = -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->max_authtries = -1;	options->banner = NULL;	options->use_dns = -1;	options->client_alive_interval = -1;	options->client_alive_count_max = -1;	options->authorized_keys_file = NULL;	options->authorized_keys_file2 = NULL;	options->num_accept_env = 0;	/* Needs to be accessable in many places */	use_privsep = -1;}voidfill_default_server_options(ServerOptions *options){	/* Portable-specific options */	if (options->use_pam == -1)		options->use_pam = 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 = 120;	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->tcp_keep_alive == -1)		options->tcp_keep_alive = 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_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 (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;	if (options->kerberos_get_afs_token == -1)		options->kerberos_get_afs_token = 0;	if (options->gss_authentication == -1)		options->gss_authentication = 0;	if (options->gss_cleanup_creds == -1)		options->gss_cleanup_creds = 1;	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->permit_user_env == -1)		options->permit_user_env = 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->max_authtries == -1)		options->max_authtries = DEFAULT_AUTH_FAIL_MAX;	if (options->use_dns == -1)		options->use_dns = 1;	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;#ifndef HAVE_MMAP	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 */	sUsePAM,	/* Standard Options */	sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,	sPermitRootLogin, sLogFacility, sLogLevel,	sRhostsRSAAuthentication, sRSAAuthentication,	sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,	sKerberosGetAFSToken,	sKerberosTgtPassing, sChallengeResponseAuthentication,	sPasswordAuthentication, sKbdInteractiveAuthentication,	sListenAddress, sAddressFamily,	sPrintMotd, sPrintLastLog, sIgnoreRhosts,	sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,	sStrictModes, sEmptyPasswd, sTCPKeepAlive,	sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression,	sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,	sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,	sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem,	sMaxStartups, sMaxAuthTries,	sBanner, sUseDNS, sHostbasedAuthentication,	sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,	sClientAliveCountMax, sAuthorizedKeysFile, sAuthorizedKeysFile2,	sGssAuthentication, sGssCleanupCreds, sAcceptEnv,	sUsePrivilegeSeparation,	sDeprecated, sUnsupported} ServerOpCodes;/* Textual representation of the tokens. */static struct {	const char *name;	ServerOpCodes opcode;} keywords[] = {	/* Portable-specific options */#ifdef USE_PAM	{ "usepam", sUsePAM },#else	{ "usepam", sUnsupported },#endif	{ "pamauthenticationviakbdint", sDeprecated },	/* Standard Options */	{ "port", sPort },	{ "hostkey", sHostKeyFile },	{ "hostdsakey", sHostKeyFile },					/* alias */	{ "pidfile", sPidFile },	{ "serverkeybits", sServerKeyBits },	{ "logingracetime", sLoginGraceTime },	{ "keyregenerationinterval", sKeyRegenerationTime },	{ "permitrootlogin", sPermitRootLogin },	{ "syslogfacility", sLogFacility },	{ "loglevel", sLogLevel },	{ "rhostsauthentication", sDeprecated },	{ "rhostsrsaauthentication", sRhostsRSAAuthentication },	{ "hostbasedauthentication", sHostbasedAuthentication },	{ "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly },	{ "rsaauthentication", sRSAAuthentication },	{ "pubkeyauthentication", sPubkeyAuthentication },	{ "dsaauthentication", sPubkeyAuthentication },			/* alias */#ifdef KRB5	{ "kerberosauthentication", sKerberosAuthentication },	{ "kerberosorlocalpasswd", sKerberosOrLocalPasswd },	{ "kerberosticketcleanup", sKerberosTicketCleanup },#ifdef USE_AFS	{ "kerberosgetafstoken", sKerberosGetAFSToken },#else	{ "kerberosgetafstoken", sUnsupported },#endif#else	{ "kerberosauthentication", sUnsupported },	{ "kerberosorlocalpasswd", sUnsupported },	{ "kerberosticketcleanup", sUnsupported },	{ "kerberosgetafstoken", sUnsupported },#endif	{ "kerberostgtpassing", sUnsupported },	{ "afstokenpassing", sUnsupported },#ifdef GSSAPI	{ "gssapiauthentication", sGssAuthentication },	{ "gssapicleanupcredentials", sGssCleanupCreds },#else	{ "gssapiauthentication", sUnsupported },	{ "gssapicleanupcredentials", sUnsupported },#endif	{ "passwordauthentication", sPasswordAuthentication },	{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication },	{ "challengeresponseauthentication", sChallengeResponseAuthentication },	{ "skeyauthentication", sChallengeResponseAuthentication }, /* alias */	{ "checkmail", sDeprecated },	{ "listenaddress", sListenAddress },	{ "addressfamily", sAddressFamily },	{ "printmotd", sPrintMotd },	{ "printlastlog", sPrintLastLog },	{ "ignorerhosts", sIgnoreRhosts },	{ "ignoreuserknownhosts", sIgnoreUserKnownHosts },	{ "x11forwarding", sX11Forwarding },	{ "x11displayoffset", sX11DisplayOffset },	{ "x11uselocalhost", sX11UseLocalhost },	{ "xauthlocation", sXAuthLocation },	{ "strictmodes", sStrictModes },	{ "permitemptypasswords", sEmptyPasswd },	{ "permituserenvironment", sPermitUserEnvironment },	{ "uselogin", sUseLogin },	{ "compression", sCompression },	{ "tcpkeepalive", sTCPKeepAlive },	{ "keepalive", sTCPKeepAlive },				/* obsolete alias */	{ "allowtcpforwarding", sAllowTcpForwarding },	{ "allowusers", sAllowUsers },	{ "denyusers", sDenyUsers },	{ "allowgroups", sAllowGroups },	{ "denygroups", sDenyGroups },	{ "ciphers", sCiphers },	{ "macs", sMacs },	{ "protocol", sProtocol },	{ "gatewayports", sGatewayPorts },	{ "subsystem", sSubsystem },	{ "maxstartups", sMaxStartups },	{ "maxauthtries", sMaxAuthTries },	{ "banner", sBanner },	{ "usedns", sUseDNS },	{ "verifyreversemapping", sDeprecated },	{ "reversemappingcheck", sDeprecated },	{ "clientaliveinterval", sClientAliveInterval },	{ "clientalivecountmax", sClientAliveCountMax },	{ "authorizedkeysfile", sAuthorizedKeysFile },	{ "authorizedkeysfile2", sAuthorizedKeysFile2 },	{ "useprivilegeseparation", sUsePrivilegeSeparation},	{ "acceptenv", sAcceptEnv },	{ 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 (options->address_family == -1)		options->address_family = AF_UNSPEC;	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 = options->address_family;	hints.ai_socktype = SOCK_STREAM;	hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;	snprintf(strport, sizeof strport, "%u", 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, i, n;	ServerOpCodes opcode;	u_short port;	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 sUsePAM:		intptr = &options->use_pam;		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.",			    filename, linenum);		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing port number.",			    filename, linenum);		options->ports[options->num_ports++] = a2port(arg);		if (options->ports[options->num_ports-1] == 0)			fatal("%s line %d: Badly formatted port number.",			    filename, linenum);		break;	case sServerKeyBits:		intptr = &options->server_key_bits;parse_int:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing integer value.",			    filename, linenum);		value = atoi(arg);		if (*intptr == -1)			*intptr = value;		break;	case sLoginGraceTime:		intptr = &options->login_grace_time;parse_time:		arg = strdelim(&cp);		if (!arg || *arg == '\0')			fatal("%s line %d: missing time value.",			    filename, linenum);		if ((value = convtime(arg)) == -1)			fatal("%s line %d: invalid time value.",			    filename, linenum);		if (*intptr == -1)			*intptr = value;

⌨️ 快捷键说明

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