1*ce74bacaSMatthew Dillon /* $OpenBSD: servconf.h,v 1.126 2017/10/02 19:33:20 djm Exp $ */ 218de8d7fSPeter Avalos 318de8d7fSPeter Avalos /* 418de8d7fSPeter Avalos * Author: Tatu Ylonen <ylo@cs.hut.fi> 518de8d7fSPeter Avalos * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 618de8d7fSPeter Avalos * All rights reserved 718de8d7fSPeter Avalos * Definitions for server configuration data and for the functions reading it. 818de8d7fSPeter Avalos * 918de8d7fSPeter Avalos * As far as I am concerned, the code I have written for this software 1018de8d7fSPeter Avalos * can be used freely for any purpose. Any derived versions of this 1118de8d7fSPeter Avalos * software must be clearly marked as such, and if the derived work is 1218de8d7fSPeter Avalos * incompatible with the protocol description in the RFC file, it must be 1318de8d7fSPeter Avalos * called by a name other than "ssh" or "Secure Shell". 1418de8d7fSPeter Avalos */ 1518de8d7fSPeter Avalos 1618de8d7fSPeter Avalos #ifndef SERVCONF_H 1718de8d7fSPeter Avalos #define SERVCONF_H 1818de8d7fSPeter Avalos 1918de8d7fSPeter Avalos #define MAX_PORTS 256 /* Max # ports. */ 2018de8d7fSPeter Avalos 2118de8d7fSPeter Avalos #define MAX_ALLOW_USERS 256 /* Max # users on allow list. */ 2218de8d7fSPeter Avalos #define MAX_DENY_USERS 256 /* Max # users on deny list. */ 2318de8d7fSPeter Avalos #define MAX_ALLOW_GROUPS 256 /* Max # groups on allow list. */ 2418de8d7fSPeter Avalos #define MAX_DENY_GROUPS 256 /* Max # groups on deny list. */ 2518de8d7fSPeter Avalos #define MAX_SUBSYSTEMS 256 /* Max # subsystems. */ 2618de8d7fSPeter Avalos #define MAX_HOSTKEYS 256 /* Max # hostkeys. */ 27856ea928SPeter Avalos #define MAX_HOSTCERTS 256 /* Max # host certificates. */ 2818de8d7fSPeter Avalos #define MAX_ACCEPT_ENV 256 /* Max # of env vars. */ 2918de8d7fSPeter Avalos #define MAX_MATCH_GROUPS 256 /* Max # of groups for Match. */ 301c188a7fSPeter Avalos #define MAX_AUTHKEYS_FILES 256 /* Max # of authorized_keys files. */ 3136e94dc5SPeter Avalos #define MAX_AUTH_METHODS 256 /* Max # of AuthenticationMethods. */ 3218de8d7fSPeter Avalos 3318de8d7fSPeter Avalos /* permit_root_login */ 3418de8d7fSPeter Avalos #define PERMIT_NOT_SET -1 3518de8d7fSPeter Avalos #define PERMIT_NO 0 3618de8d7fSPeter Avalos #define PERMIT_FORCED_ONLY 1 3718de8d7fSPeter Avalos #define PERMIT_NO_PASSWD 2 3818de8d7fSPeter Avalos #define PERMIT_YES 3 3918de8d7fSPeter Avalos 401c188a7fSPeter Avalos /* use_privsep */ 411c188a7fSPeter Avalos #define PRIVSEP_OFF 0 421c188a7fSPeter Avalos #define PRIVSEP_ON 1 4399e85e0dSPeter Avalos #define PRIVSEP_NOSANDBOX 2 441c188a7fSPeter Avalos 4536e94dc5SPeter Avalos /* AllowTCPForwarding */ 4636e94dc5SPeter Avalos #define FORWARD_DENY 0 4736e94dc5SPeter Avalos #define FORWARD_REMOTE (1) 4836e94dc5SPeter Avalos #define FORWARD_LOCAL (1<<1) 4936e94dc5SPeter Avalos #define FORWARD_ALLOW (FORWARD_REMOTE|FORWARD_LOCAL) 5036e94dc5SPeter Avalos 51*ce74bacaSMatthew Dillon /* PermitOpen */ 52*ce74bacaSMatthew Dillon #define PERMITOPEN_ANY 0 53*ce74bacaSMatthew Dillon #define PERMITOPEN_NONE -2 54*ce74bacaSMatthew Dillon 5518de8d7fSPeter Avalos #define DEFAULT_AUTH_FAIL_MAX 6 /* Default for MaxAuthTries */ 5618de8d7fSPeter Avalos #define DEFAULT_SESSIONS_MAX 10 /* Default for MaxSessions */ 5718de8d7fSPeter Avalos 5818de8d7fSPeter Avalos /* Magic name for internal sftp-server */ 5918de8d7fSPeter Avalos #define INTERNAL_SFTP_NAME "internal-sftp" 6018de8d7fSPeter Avalos 61*ce74bacaSMatthew Dillon struct ssh; 62*ce74bacaSMatthew Dillon struct fwd_perm_list; 63*ce74bacaSMatthew Dillon 6418de8d7fSPeter Avalos typedef struct { 6518de8d7fSPeter Avalos u_int num_ports; 6618de8d7fSPeter Avalos u_int ports_from_cmdline; 67cb5eb4f1SPeter Avalos int ports[MAX_PORTS]; /* Port number to listen on. */ 68e9778795SPeter Avalos u_int num_queued_listens; 69e9778795SPeter Avalos char **queued_listen_addrs; 70e9778795SPeter Avalos int *queued_listen_ports; 7118de8d7fSPeter Avalos struct addrinfo *listen_addrs; /* Addresses on which the server listens. */ 7218de8d7fSPeter Avalos int address_family; /* Address family used by the server. */ 7318de8d7fSPeter Avalos char *host_key_files[MAX_HOSTKEYS]; /* Files containing host keys. */ 7418de8d7fSPeter Avalos int num_host_key_files; /* Number of files for host keys. */ 75856ea928SPeter Avalos char *host_cert_files[MAX_HOSTCERTS]; /* Files containing host certs. */ 76856ea928SPeter Avalos int num_host_cert_files; /* Number of files for host certs. */ 7736e94dc5SPeter Avalos char *host_key_agent; /* ssh-agent socket for host keys. */ 7818de8d7fSPeter Avalos char *pid_file; /* Where to put our pid */ 7918de8d7fSPeter Avalos int login_grace_time; /* Disconnect if no auth in this time 8018de8d7fSPeter Avalos * (sec). */ 8118de8d7fSPeter Avalos int permit_root_login; /* PERMIT_*, see above */ 8218de8d7fSPeter Avalos int ignore_rhosts; /* Ignore .rhosts and .shosts. */ 8318de8d7fSPeter Avalos int ignore_user_known_hosts; /* Ignore ~/.ssh/known_hosts 8418de8d7fSPeter Avalos * for RhostsRsaAuth */ 8518de8d7fSPeter Avalos int print_motd; /* If true, print /etc/motd. */ 8618de8d7fSPeter Avalos int print_lastlog; /* If true, print lastlog */ 8718de8d7fSPeter Avalos int x11_forwarding; /* If true, permit inet (spoofing) X11 fwd. */ 8818de8d7fSPeter Avalos int x11_display_offset; /* What DISPLAY number to start 8918de8d7fSPeter Avalos * searching at */ 9018de8d7fSPeter Avalos int x11_use_localhost; /* If true, use localhost for fake X11 server. */ 9118de8d7fSPeter Avalos char *xauth_location; /* Location of xauth program */ 9236e94dc5SPeter Avalos int permit_tty; /* If false, deny pty allocation */ 9336e94dc5SPeter Avalos int permit_user_rc; /* If false, deny ~/.ssh/rc execution */ 9418de8d7fSPeter Avalos int strict_modes; /* If true, require string home dir modes. */ 9518de8d7fSPeter Avalos int tcp_keep_alive; /* If true, set SO_KEEPALIVE. */ 969f304aafSPeter Avalos int ip_qos_interactive; /* IP ToS/DSCP/class for interactive */ 979f304aafSPeter Avalos int ip_qos_bulk; /* IP ToS/DSCP/class for bulk traffic */ 9818de8d7fSPeter Avalos char *ciphers; /* Supported SSH2 ciphers. */ 9918de8d7fSPeter Avalos char *macs; /* Supported SSH2 macs. */ 1009f304aafSPeter Avalos char *kex_algorithms; /* SSH2 kex methods in order of preference. */ 10136e94dc5SPeter Avalos struct ForwardOptions fwd_opts; /* forwarding options */ 10218de8d7fSPeter Avalos SyslogFacility log_facility; /* Facility for system logging. */ 10318de8d7fSPeter Avalos LogLevel log_level; /* Level for system logging. */ 10418de8d7fSPeter Avalos int hostbased_authentication; /* If true, permit ssh2 hostbased auth */ 10518de8d7fSPeter Avalos int hostbased_uses_name_from_packet_only; /* experimental */ 106e9778795SPeter Avalos char *hostbased_key_types; /* Key types allowed for hostbased */ 107e9778795SPeter Avalos char *hostkeyalgorithms; /* SSH2 server key types */ 10818de8d7fSPeter Avalos int pubkey_authentication; /* If true, permit ssh2 pubkey authentication. */ 109e9778795SPeter Avalos char *pubkey_key_types; /* Key types allowed for public key */ 11018de8d7fSPeter Avalos int kerberos_authentication; /* If true, permit Kerberos 11118de8d7fSPeter Avalos * authentication. */ 11218de8d7fSPeter Avalos int kerberos_or_local_passwd; /* If true, permit kerberos 11318de8d7fSPeter Avalos * and any other password 11418de8d7fSPeter Avalos * authentication mechanism, 11518de8d7fSPeter Avalos * such as SecurID or 11618de8d7fSPeter Avalos * /etc/passwd */ 11718de8d7fSPeter Avalos int kerberos_ticket_cleanup; /* If true, destroy ticket 11818de8d7fSPeter Avalos * file on logout. */ 11918de8d7fSPeter Avalos int kerberos_get_afs_token; /* If true, try to get AFS token if 12018de8d7fSPeter Avalos * authenticated with Kerberos. */ 12118de8d7fSPeter Avalos int gss_authentication; /* If true, permit GSSAPI authentication */ 12218de8d7fSPeter Avalos int gss_cleanup_creds; /* If true, destroy cred cache on logout */ 123e9778795SPeter Avalos int gss_strict_acceptor; /* If true, restrict the GSSAPI acceptor name */ 12418de8d7fSPeter Avalos int password_authentication; /* If true, permit password 12518de8d7fSPeter Avalos * authentication. */ 12618de8d7fSPeter Avalos int kbd_interactive_authentication; /* If true, permit */ 12718de8d7fSPeter Avalos int challenge_response_authentication; 12818de8d7fSPeter Avalos int permit_empty_passwd; /* If false, do not permit empty 12918de8d7fSPeter Avalos * passwords. */ 13018de8d7fSPeter Avalos int permit_user_env; /* If true, read ~/.ssh/environment */ 13118de8d7fSPeter Avalos int compression; /* If true, compression is allowed */ 13236e94dc5SPeter Avalos int allow_tcp_forwarding; /* One of FORWARD_* */ 13336e94dc5SPeter Avalos int allow_streamlocal_forwarding; /* One of FORWARD_* */ 13418de8d7fSPeter Avalos int allow_agent_forwarding; 135*ce74bacaSMatthew Dillon int disable_forwarding; 13618de8d7fSPeter Avalos u_int num_allow_users; 13718de8d7fSPeter Avalos char *allow_users[MAX_ALLOW_USERS]; 13818de8d7fSPeter Avalos u_int num_deny_users; 13918de8d7fSPeter Avalos char *deny_users[MAX_DENY_USERS]; 14018de8d7fSPeter Avalos u_int num_allow_groups; 14118de8d7fSPeter Avalos char *allow_groups[MAX_ALLOW_GROUPS]; 14218de8d7fSPeter Avalos u_int num_deny_groups; 14318de8d7fSPeter Avalos char *deny_groups[MAX_DENY_GROUPS]; 14418de8d7fSPeter Avalos 14518de8d7fSPeter Avalos u_int num_subsystems; 14618de8d7fSPeter Avalos char *subsystem_name[MAX_SUBSYSTEMS]; 14718de8d7fSPeter Avalos char *subsystem_command[MAX_SUBSYSTEMS]; 14818de8d7fSPeter Avalos char *subsystem_args[MAX_SUBSYSTEMS]; 14918de8d7fSPeter Avalos 15018de8d7fSPeter Avalos u_int num_accept_env; 15118de8d7fSPeter Avalos char *accept_env[MAX_ACCEPT_ENV]; 15218de8d7fSPeter Avalos 15318de8d7fSPeter Avalos int max_startups_begin; 15418de8d7fSPeter Avalos int max_startups_rate; 15518de8d7fSPeter Avalos int max_startups; 15618de8d7fSPeter Avalos int max_authtries; 15718de8d7fSPeter Avalos int max_sessions; 15818de8d7fSPeter Avalos char *banner; /* SSH-2 banner message */ 15918de8d7fSPeter Avalos int use_dns; 16018de8d7fSPeter Avalos int client_alive_interval; /* 16118de8d7fSPeter Avalos * poke the client this often to 16218de8d7fSPeter Avalos * see if it's still there 16318de8d7fSPeter Avalos */ 16418de8d7fSPeter Avalos int client_alive_count_max; /* 16518de8d7fSPeter Avalos * If the client is unresponsive 16618de8d7fSPeter Avalos * for this many intervals above, 16718de8d7fSPeter Avalos * disconnect the session 16818de8d7fSPeter Avalos */ 16918de8d7fSPeter Avalos 1701c188a7fSPeter Avalos u_int num_authkeys_files; /* Files containing public keys */ 1711c188a7fSPeter Avalos char *authorized_keys_files[MAX_AUTHKEYS_FILES]; 17218de8d7fSPeter Avalos 17318de8d7fSPeter Avalos char *adm_forced_command; 17418de8d7fSPeter Avalos 17518de8d7fSPeter Avalos int use_pam; /* Enable auth via PAM */ 17618de8d7fSPeter Avalos 17718de8d7fSPeter Avalos int permit_tun; 17818de8d7fSPeter Avalos 179*ce74bacaSMatthew Dillon char **permitted_opens; 180*ce74bacaSMatthew Dillon u_int num_permitted_opens; /* May also be one of PERMITOPEN_* */ 18118de8d7fSPeter Avalos 18218de8d7fSPeter Avalos char *chroot_directory; 183856ea928SPeter Avalos char *revoked_keys_file; 184856ea928SPeter Avalos char *trusted_user_ca_keys; 18536e94dc5SPeter Avalos char *authorized_keys_command; 18636e94dc5SPeter Avalos char *authorized_keys_command_user; 187e9778795SPeter Avalos char *authorized_principals_file; 188e9778795SPeter Avalos char *authorized_principals_command; 189e9778795SPeter Avalos char *authorized_principals_command_user; 19036e94dc5SPeter Avalos 19136e94dc5SPeter Avalos int64_t rekey_limit; 19236e94dc5SPeter Avalos int rekey_interval; 19399e85e0dSPeter Avalos 19499e85e0dSPeter Avalos char *version_addendum; /* Appended to SSH banner */ 19536e94dc5SPeter Avalos 19636e94dc5SPeter Avalos u_int num_auth_methods; 19736e94dc5SPeter Avalos char *auth_methods[MAX_AUTH_METHODS]; 198e9778795SPeter Avalos 199e9778795SPeter Avalos int fingerprint_hash; 200*ce74bacaSMatthew Dillon int expose_userauth_info; 20118de8d7fSPeter Avalos } ServerOptions; 20218de8d7fSPeter Avalos 20399e85e0dSPeter Avalos /* Information about the incoming connection as used by Match */ 20499e85e0dSPeter Avalos struct connection_info { 20599e85e0dSPeter Avalos const char *user; 20699e85e0dSPeter Avalos const char *host; /* possibly resolved hostname */ 20799e85e0dSPeter Avalos const char *address; /* remote address */ 20899e85e0dSPeter Avalos const char *laddress; /* local address */ 20999e85e0dSPeter Avalos int lport; /* local port */ 21099e85e0dSPeter Avalos }; 21199e85e0dSPeter Avalos 21299e85e0dSPeter Avalos 2131c188a7fSPeter Avalos /* 2141c188a7fSPeter Avalos * These are string config options that must be copied between the 2151c188a7fSPeter Avalos * Match sub-config and the main config, and must be sent from the 2161c188a7fSPeter Avalos * privsep slave to the privsep master. We use a macro to ensure all 2171c188a7fSPeter Avalos * the options are copied and the copies are done in the correct order. 21836e94dc5SPeter Avalos * 21936e94dc5SPeter Avalos * NB. an option must appear in servconf.c:copy_set_server_options() or 22036e94dc5SPeter Avalos * COPY_MATCH_STRING_OPTS here but never both. 2211c188a7fSPeter Avalos */ 2221c188a7fSPeter Avalos #define COPY_MATCH_STRING_OPTS() do { \ 2231c188a7fSPeter Avalos M_CP_STROPT(banner); \ 2241c188a7fSPeter Avalos M_CP_STROPT(trusted_user_ca_keys); \ 2251c188a7fSPeter Avalos M_CP_STROPT(revoked_keys_file); \ 22636e94dc5SPeter Avalos M_CP_STROPT(authorized_keys_command); \ 22736e94dc5SPeter Avalos M_CP_STROPT(authorized_keys_command_user); \ 228e9778795SPeter Avalos M_CP_STROPT(authorized_principals_file); \ 229e9778795SPeter Avalos M_CP_STROPT(authorized_principals_command); \ 230e9778795SPeter Avalos M_CP_STROPT(authorized_principals_command_user); \ 231e9778795SPeter Avalos M_CP_STROPT(hostbased_key_types); \ 232e9778795SPeter Avalos M_CP_STROPT(pubkey_key_types); \ 2331c188a7fSPeter Avalos M_CP_STRARRAYOPT(authorized_keys_files, num_authkeys_files); \ 23499e85e0dSPeter Avalos M_CP_STRARRAYOPT(allow_users, num_allow_users); \ 23599e85e0dSPeter Avalos M_CP_STRARRAYOPT(deny_users, num_deny_users); \ 23699e85e0dSPeter Avalos M_CP_STRARRAYOPT(allow_groups, num_allow_groups); \ 23799e85e0dSPeter Avalos M_CP_STRARRAYOPT(deny_groups, num_deny_groups); \ 23899e85e0dSPeter Avalos M_CP_STRARRAYOPT(accept_env, num_accept_env); \ 23936e94dc5SPeter Avalos M_CP_STRARRAYOPT(auth_methods, num_auth_methods); \ 240*ce74bacaSMatthew Dillon M_CP_STRARRAYOPT_ALLOC(permitted_opens, num_permitted_opens); \ 2411c188a7fSPeter Avalos } while (0) 2421c188a7fSPeter Avalos 24399e85e0dSPeter Avalos struct connection_info *get_connection_info(int, int); 24418de8d7fSPeter Avalos void initialize_server_options(ServerOptions *); 24518de8d7fSPeter Avalos void fill_default_server_options(ServerOptions *); 24618de8d7fSPeter Avalos int process_server_config_line(ServerOptions *, char *, const char *, int, 24799e85e0dSPeter Avalos int *, struct connection_info *); 248*ce74bacaSMatthew Dillon void process_permitopen(struct ssh *ssh, ServerOptions *options); 24918de8d7fSPeter Avalos void load_server_config(const char *, Buffer *); 25018de8d7fSPeter Avalos void parse_server_config(ServerOptions *, const char *, Buffer *, 25199e85e0dSPeter Avalos struct connection_info *); 25299e85e0dSPeter Avalos void parse_server_match_config(ServerOptions *, struct connection_info *); 25399e85e0dSPeter Avalos int parse_server_match_testspec(struct connection_info *, char *); 25499e85e0dSPeter Avalos int server_match_spec_complete(struct connection_info *); 25518de8d7fSPeter Avalos void copy_set_server_options(ServerOptions *, ServerOptions *, int); 25618de8d7fSPeter Avalos void dump_config(ServerOptions *); 257856ea928SPeter Avalos char *derelativise_path(const char *); 25818de8d7fSPeter Avalos 25918de8d7fSPeter Avalos #endif /* SERVCONF_H */ 260