view modules/fail2ban/manifests/init.pp @ 480:2c3e745be8d2

Update server defs and own modules to match * $osver and $fqdn and others are now all in $facts * Firewall swapped action for jump and has new way to do IPv6 * SSH server setup changed * Resolve warnings from fileserver.conf * has_key() no longer exists because Puppet can do "key in array" * Some variables are now more strictly typed Also: * Try to configure full IPv6 DNS resolver * Clean up old config - unused servers and some CentOS complexity
author IBBoard <dev@ibboard.co.uk>
date Thu, 29 Aug 2024 18:58:49 +0100
parents dde1d7e2309b
children
line wrap: on
line source

class fail2ban (
	$firewall_cmd,
	) {
	package { 'fail2ban':
		ensure => installed,
	}
	service { 'fail2ban':
		ensure => running,
		enable => true
	}
	File<| tag == 'fail2ban' |> {
		ensure => present,
		require => Package['fail2ban'],
		notify => Service['fail2ban'],
	}
	file { '/etc/fail2ban/fail2ban.local':
		source => 'puppet:///modules/fail2ban/fail2ban.local',
	}
	if $facts["os"]["family"] == 'RedHat' {
		$ssh_log = '/var/log/secure'
		$mail_log = '/var/log/maillog'
		$log_group = 'root'
		$log_mode = '0600'
	}
	elsif $facts["os"]["family"] == 'Debian' {
		$ssh_log = '/var/log/auth.log'
		$mail_log = '/var/log/mail.log'
		$log_group = 'adm'
		$log_mode = '0640'
	}
	file { '/etc/fail2ban/jail.local':
		content => epp('fail2ban/jail.local.epp', {'ssh_log' => $ssh_log, 'mail_log' => $mail_log})
	}
	file { '/etc/fail2ban/action.d/apf.conf':
		source => 'puppet:///modules/fail2ban/apf.conf',
	}

	if $firewall_cmd == 'iptables' {
		$firewall_ban_cmd = 'iptables-multiport'
	} else {
		$firewall_ban_cmd = $firewall_cmd
	}

	if $facts["os"]["family"] == 'RedHat' {
		$apache_conf_custom = '/etc/httpd/conf.custom/'
	}
	elsif $facts["os"]["family"] == 'Debian' {
		$apache_conf_custom = '/etc/apache2/conf.custom/'
	}
	
	# Create an empty banlist file if it doesn't exist
	exec { "httxt2dbm -i /dev/null -o ${apache_conf_custom}apache_banlist.db":
		path => '/sbin:/usr/bin',
		unless => "test -f ${apache_conf_custom}apache_banlist.db",
		require => Class['website'],
		before => Service['httpd'],
	}
	file { '/tmp/apache_banlist.txt':
		ensure => present,
		seltype => 'httpd_config_t',
	}
	# Create an empty repeat banlist file if it doesn't exist
	exec { "httxt2dbm -i /dev/null -o ${apache_conf_custom}apache_repeat_banlist.db":
		path => '/sbin:/usr/bin',
		unless => "test -f ${apache_conf_custom}apache_repeat_banlist.db",
		require => Class['website'],
		before => Service['httpd'],
	}
	file { '/tmp/apache_repeat_banlist.txt':
		ensure => present,
		seltype => 'httpd_config_t',
	}
	if $facts["os"]["name"] == 'CentOS' {
		# And let the httxt2dbm process work the rest of the time
		file { '/etc/selinux/apache-ip-banlist.pp':
			source => 'puppet:///modules/fail2ban/apache-ip-banlist.pp',
		} ~>
		exec { 'semodule -i /etc/selinux/apache-ip-banlist.pp':
			path => '/usr/sbin',
			refreshonly => true,
		}
	}
	file { '/etc/fail2ban/action.d/firewall-ban.conf':
		ensure => link,
		target => "/etc/fail2ban/action.d/${firewall_ban_cmd}.conf",
	}
	file { '/etc/fail2ban/action.d/ibb-apache-ip-block.conf':
		source => 'puppet:///modules/fail2ban/ibb-apache-ip-block.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-apache-exploits-instaban.conf':
		source => 'puppet:///modules/fail2ban/ibb-apache-exploits-instaban.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-apache-shellshock.conf':
		source => 'puppet:///modules/fail2ban/ibb-apache-shellshock.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-repeat-offender.conf':
		source => 'puppet:///modules/fail2ban/ibb-repeat-offender.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-repeat-offender-ssh.conf':
		source => 'puppet:///modules/fail2ban/ibb-repeat-offender-ssh.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-postfix-spammers.conf':
		source => 'puppet:///modules/fail2ban/ibb-postfix-spammers.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-postfix-malicious.conf':
		source => 'puppet:///modules/fail2ban/ibb-postfix-malicious.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-postfix.conf':
		source => 'puppet:///modules/fail2ban/ibb-postfix.conf',
	}
	file { '/etc/fail2ban/filter.d/ibb-sshd.conf':
		source => 'puppet:///modules/fail2ban/ibb-sshd.conf',
	}

	$bad_users = [
		[
		'[^0-9a-zA-Z]+',
		'\.?[0-9]+\.?',
		'[0-9a-zA-Z]{1,3}',
		'([0-9a-z])\2{2,}',
		'abused',
		'Admin',
		'[aA]dministr[a-z0-9\\\\]+', # administracion, administrador, administradorweb, administrator, administrat\303\266r (escaped รถ) etc
		'admin-?gui',
		'adminuser',
		'admissions',
		'altibase',
		'alumni',
		'amavisd?',
		'amax[0-9]+',
		'amministratore',
		'amssys',
		'anwenderschnittstelle',
		'anonymous',
		'ansible',
		'apache',
		'apps',
		'aptproxy',
		'apt-mirror',
		'ark(server)?',
		'asdfas',
		'asterisk',
		'audio',
		'auser',
		'autologin',
		'avahi',
		'avis',
		'backlog',
		'backup(s|er|pc|user)?',
		'bash',
		'batch',
		'beagleindex',
		'benutzer', # German user account
		'bf2',
		'.*bitbucket',
		'bind',
		'biology',
		'bitcoin',
		'bitnami',
		'bitrix',
		'bkroot',
		'blog',
		'boinc',
		'bot',
		'botmaster',
		'bouncer',
		'browser',
		'bugzilla',
		'build',
		'buscador',
		'cacti(user)?',
		'camera',
		'carrerasoft',
		'catchall',
		'celery',
		'cemergen',
		'centos',
		'chef',
		'chimistry',
		'cgi',
		'chromeuser',
		'cinema',
		'cinstall',
		'cisco',
		'clamav',
		'cliente?[0-9]*',
		'CloudSigma',
		'clouduser',
		'com',
		'comercial',
		'configure',
		'console',
		'contact',
		'control',
		'couchdb',
		'cpanel',
		'cpanelrrdtool',
		'create',
		'cron',
		'(cs(s|go|cz)|arma|mc|tf2?|sdtd|web|pz)-?se?rve?r?',
		'cs-?go1?',
		'CumulusLinux!',
		'customer',
		'cyrus[0-9]*',
		'daemon',
		'danger',
		'darwin',
		'dasuse?r[0-9]*',
		'data(ba?se)?',
		'db2inst[0-9]*',
		'dbcloud',
		'dbus',
		'debian(-spamd)?',
		'default',
		'dell',
		'demo',
		'deploy(er)?[0-9]*',
		'desktop',
		'developer',
		'devdata',
		'devops',
		'devteam',
		'dietpi',
		'discordbot',
		'disklessadmin',
		'display',
		'django',
		'dmarc',
		'dpvirtual',
		'docker(user)?',
		'dotblot',
		'download',
		'dovecot',
		'dovenull',
		'duplicity',
		'easy',
		'ec2-user',
		'ecquser',
		'edu(cation)?[0-9]*',
		'e-shop',
		'elastic',
		'elsearch',
		'engin(eer)?',
		'esadmin',
		'events',
		'exploit',
		'exports?',
		'facebook',
		'factorio',
		'fax',
		'fcweb',
		'fetchmail',
		'filter',
		'firebird',
		'firefox',
		'ftp(admin)?',
		'fuser',
		],[
		'games',
		'gdm',
		'geometry',
		'geniuz',
		'getmail',
		'ggc_user',
		'ghost',
		'git(olite?|blit|lab(_ci)?|admi?n?|use?r)?',
		'glassfish',
		'gmail',
		'gmodserver',
		'gnuhealth',
		'google',
		'gopher',
		'government',
		'gpadmin',
		'grape',
		'grid',
		'guest',
		'hacker',
		'hadoop',
		'haldaemon',
		'harvard',
		'hduser',
		'headmaster',
		'helpdesk',
		'hive',
		'home',
		'host',
		'httpd?',
		'httpfs',
		'huawei',
		'iamroot',
		'iceuser',
		'image',
		'imscp',
		'info(rmix)?[0-9]*',
		'inst[0-9]+',
		'install(er)?',
		'interadmin',
		'inventario',
		'java',
		'jboss',
		'jenkins',
		'jira',
		'jmeter',
		'joomla',
		'jquery',
		'jsboss',
		'juniper',
		'kafka',
		'kodi',
		'kms',
		'ldap',
		'legacy',
		'library',
		'libsys',
		'libuuid',
		'linode',
		'linux',
		'localadmin',
		'logcheck',
		'login',
		'logout',
		'logstash',
		'logview(er)?',
		'lsfadmin',
		'lynx',
		],[
		'magento',
		'mail',
		'mailer',
		'mailman',
		'mailtest',
		'maintain',
		'majordomo',
		'man',
		'mantis',
		'mapruser',
		'marketing',
		'master',
		'member(ship)?',
		'merlin',
		'messagebus',
		'minecraft',
		'mirc',
		'modem',
		'mongo(db|user)?',
		'monitor(ing)?',
		'more',
		'moher',
		'mpiuser',
		'mqadm',
		'musi[ck]bot',
		'(my?|pg)(sq(ue)?l|admin)[0-9]*',
		'mythtv',
		'nagios',
		'named',
		'nasa',
		'ncs',
		'nessus',
		'netadmin',
		'netdiag',
		'netdump',
		'network',
		'netzplatz',
		'newadmin',
		'newuser',
		'nexus',
		'nfinity',
		'nfs',
		'(nfs)?nobody',
		'nginx',
		'noc',
		'node',
		'notes',
		'nothing',
		'NpC',
		'ntps',
		'nux',
		'odoo',
		'odroid',
		'office',
		'omsagent',
		'onyxeye',
		'oozie',
		'openbravo',
		'openfire',
		'openerp',
		'openvpn',
		'operador',
		'operator',
		'ops(code)?',
		'oprofile',
		'ora_?(cle|prod|root|vis)[0-9]*',
		'orbital',
		'osmc',
		'owncloud',
		'papernet',
		'passwo?r?d',
		'payments',
		'pay_?pal',
		'pdfbox',
		'pentaho',
		'php[0-9]*',
		'platform',
		'play',
		'PlcmSpIp(PlcmSpIp)?',
		'plesk',
		'plex',
		'point',
		'polkitd?',
		'popd?3?',
		'popuser',
		'portal',
		'postfix',
		'p0stgr3s',
		'postgres',
		'postmaster',
		'pptpd',
		'print',
		'privoxy',
		'proba',
		'Prometheus',
		'proxy',
		'public',
		'puppet',
		'pwla',
		'qhsupport',
		'rabbit(mq)?',
		'radio',
		'radiusd?',
		'raspberry',
		'readonly',
		'reboot',
		'recording',
		'redis',
		'redmine',
		'remot[eo]',
		'reports',
		'riakcs',
		'root[0-9a-zA-Z]+',
		'rpc(user)?',
		'rpm',
		'RPM',
		'rtorrent',
		],[
		'rustserver',
		'sales[0-9]+',
		'samp',
		's?bin',
		'saslauth',
		'scan(n?er)?',
		'screen',
		'search',
		'sekretariat',
		'server',
		'serverpilot',
		'service',
		'setup',
		'(s|u|user|ams|admin|inss|pro|web)?ftp(d|[_-]?use?r|home|_?test|immo)?[0-9]*',
		'sftponly',
		'shell',
		'shop',
		'sinusbot[0-9]*',
		'sirius',
		'smbguest',
		'smbuse?r',
		'smmsp',
		'socket',
		'software',
		'solr',
		'solarus',
		'spam',
		'spark',
		'speech-dispatcher',
		'splunk',
		'sprummlbot',
		'squid',
		'squirrelmail[0-9]+',
		'srvadmin',
		'sshd',
		'sshusr',
		'staffc',
		'steam(cmd)?',
		'store',
		'stream',
		'stunnel',
		'super(user)?',
		'suporte',
		'support',
		'svn(root|admin)?',
		'sybase',
		'sync[0-9]*',
		'sysadmin',
		'system',
		'teamspeak[234]?(-?use?r)?',
		'telecom(admin)?',
		'telkom',
		'telnetd?',
		'te?mp(use?r)?[0-9]*',
		'test((er?|ing|ftp|man|linux|use?r|u)[0-9]*|[0-9]+)?',
		'ttest',
		'(test)?username',
		'text',
		'tiago',
		'tomcat',
		'tools',
		'toor',
		'ts[123](se?rv(er)?|(musi[ck])?bot|sleep|user)?',
		'tss',
		'tunstall',
		'ubnt',
		'unity',
		'universitaetsrechenzentrum', # University Computing Center
		'unix',
		'uplink',
		'upload(er)?[0-9]*',
		'user[0-9]*',
		'USERID',
		'username',
		'usuario',
		'utente', # Italian user
		'uucp',
		'vagrant',
		'vbox',
		'ventrilo',
		'vhbackup',
		'video',
		'virtual',
		'virusalter',
		'vmadmin',
		'vmail',
		'vscan?',
		'vtms',
		'vyatta',
		'wanadoo',
		'web',
		'webapp',
		'webdesign',
		'weblogic',
		'webmaster',
		'webmin',
		'webportal',
		'websync',
		'wiki',
		'WinD3str0y',
		'wine',
		'wordpress',
		'wp-?user',
		'write',
		'www',
		'wwAdmin',
		'(www|web|coin|fax|sys|db2|rsync|tc)-?(adm(in)?|run|users?|data|[0-9]+)',
		'xbian',
		'xbot',
		'xmpp',
		'xoadmin',
		'yahoo',
		'yarn',
		'zabbix',
		'zimbra',
		'zookeeper',
		],[
		# User/admin/other
		'(bwair|api|appl?|ats|cam|cat|db|dev|file|imap|is|my|net|site|tech|virtual|vnc|vpn)?(admins?|app|dev|use?r|server|man|manager|mgr)[0-9]*',
		'(abc|account|git|info|redhat|samba|sshd|student|teacher|tomcat|ubuntu|web)[0-9]*',
		# Names
		'(aaron|alexander|bill|david|james|sergio|thomas|timson|tom|victor|wang)[0-9]*',
		# And some passwords that turned up as usernames
		'1q2w3e4r',
		'abc123',
		'letmein',
		'0fordn1on@#\$%%\^&',
		'P@\$\$w0rd',
		'P@ssword1!',
		'Pa\$\$word_',
		'Passwd123(\$%%\^)',
		'password',
		'pass123?4?',
		'qwer?[0-9]+',
		]
	]

	file { '/etc/fail2ban/filter.d/ibb-sshd-bad-user.conf':
		content => epp('fail2ban/ibb-sshd-bad-user.epp', { 'bad_users' => $bad_users }),
	}
	# Because one of our rules checks fail2ban's log, but the service dies without the file
	file { '/var/log/fail2ban.log':
		ensure => present,
		owner => 'root',
		group => $log_group,
		mode => $log_mode,
	}
}