ldap + dockermailserver
This commit is contained in:
		
							parent
							
								
									e5f2f505e8
								
							
						
					
					
						commit
						9f72ccca0a
					
				|  | @ -0,0 +1,3 @@ | ||||||
|  | - [ ] nameservers for users | ||||||
|  | - [ ] create dmarc.report, postmaster email users, give access to infra users | ||||||
|  | - [ ] figure oute mailbox permissions, ensure users can't just set random senders and stuff, domain fixing | ||||||
|  | @ -11,3 +11,6 @@ | ||||||
| 
 | 
 | ||||||
| - name: Kanidm | - name: Kanidm | ||||||
|   ansible.builtin.import_playbook: playbooks/deploy-kanidm.yml |   ansible.builtin.import_playbook: playbooks/deploy-kanidm.yml | ||||||
|  | 
 | ||||||
|  | - name: Mail | ||||||
|  |   ansible.builtin.import_playbook: playbooks/deploy-mail.yml | ||||||
|  |  | ||||||
|  | @ -3,3 +3,4 @@ | ||||||
| cloudflare_credentials_destination: /root/.cloudflare-dns-api-key.ini | cloudflare_credentials_destination: /root/.cloudflare-dns-api-key.ini | ||||||
| certbot_post_hook_dir: /etc/letsencrypt/renewal-hooks/post | certbot_post_hook_dir: /etc/letsencrypt/renewal-hooks/post | ||||||
| certbot_live_dir: /etc/letsencrypt/live | certbot_live_dir: /etc/letsencrypt/live | ||||||
|  | certbot_email: infra@hatecomputers.club | ||||||
|  |  | ||||||
|  | @ -4,4 +4,4 @@ host_domains: | ||||||
|   fern.hatecomputers.club: |   fern.hatecomputers.club: | ||||||
|     - fern.hatecomputers.club |     - fern.hatecomputers.club | ||||||
|     - auth.hatecomputers.club |     - auth.hatecomputers.club | ||||||
|     - vpn.hatecomputers.club |     - mail.hatecomputers.club | ||||||
|  |  | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | postmaster_email: postmaster@hatecomputers.club | ||||||
|  | 
 | ||||||
|  | domain: hatecomputers.club | ||||||
|  | mail_domain: mail.hatecomputers.club | ||||||
|  | 
 | ||||||
|  | ldap_server_host: "ldaps://auth.hatecomputers.club:3636" | ||||||
|  | ldap_search_base: "dc=auth,dc=hatecomputers,dc=club" | ||||||
|  | ldap_bind_dn: "dn=token" | ||||||
|  | 
 | ||||||
|  | ldap_query_filter_user: "(&(objectClass=posixAccount)(mail=%s))" | ||||||
|  | ldap_query_filter_group: "(&(objectClass=posixAccount)(|(mail=%s)(uid=%s)))" | ||||||
|  | ldap_query_filter_alias: "(&(objectClass=posixAccount)(emailalternative=%s))" | ||||||
|  | ldap_query_filter_domain: "(&(objectClass=posixAccount)(|(mail=%s)(uid=%s)))" | ||||||
|  | ldap_query_filter_senders: "(&(objectClass=posixAccount)(|(mail=%s)(uid=%s)))" | ||||||
|  | 
 | ||||||
|  | sasl_ldap_filter: "(&(|(uid=%U)(mail=%U))(class=posixAccount))" | ||||||
|  | 
 | ||||||
|  | dovecot_user_filter: "(&(class=posixAccount)(uid=%u))" | ||||||
|  | dovecot_auth_bind_userdn: "uid=%u,dc=auth,dc=hatecomputers,dc=club" | ||||||
|  | dovecot_user_attrs: "=mail=maildir:~/Maildir,uidNumber=uid,gidNumber=gid" | ||||||
|  | @ -4,11 +4,14 @@ fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | ||||||
| [host_domains] | [host_domains] | ||||||
| fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | ||||||
| 
 | 
 | ||||||
|  | [nginx] | ||||||
|  | fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | ||||||
|  | 
 | ||||||
| [certbot] | [certbot] | ||||||
| fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | ||||||
| 
 | 
 | ||||||
| [kanidm] | [kanidm] | ||||||
| fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | ||||||
| 
 | 
 | ||||||
| [nginx] | [mail] | ||||||
| fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | fern.hatecomputers.club  ansible_user=root ansible_connection=ssh | ||||||
|  |  | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | - name: Mail setup | ||||||
|  |   hosts: mail | ||||||
|  |   roles: | ||||||
|  |     - mail | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | echo '{}' > ~/.cache/kanidm_tokens | ||||||
|  | chmod 666 ~/.cache/kanidm_tokens | ||||||
|  | docker pull kanidm/tools:latest | ||||||
|  | docker run --rm -i -t \ | ||||||
|  |     --network host \ | ||||||
|  |     -v /etc/kanidm/config:/etc/kanidm/config:ro \ | ||||||
|  |     -v ~/.config/kanidm:/home/kanidm/.config/kanidm:ro \ | ||||||
|  |     -v ~/.cache/kanidm_tokens:/home/kanidm/.cache/kanidm_tokens \ | ||||||
|  |     kanidm/tools:latest \ | ||||||
|  |     /sbin/kanidm --help | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,56 @@ | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | - name: Ensure mail docker/compose exist | ||||||
|  |   ansible.builtin.file: | ||||||
|  |     path: /etc/docker/compose/mail | ||||||
|  |     state: directory | ||||||
|  |     owner: root | ||||||
|  |     group: root | ||||||
|  |     mode: 0700 | ||||||
|  | 
 | ||||||
|  | - name: Ensure mail config volume exist | ||||||
|  |   file: | ||||||
|  |     path: /etc/docker/compose/mail/docker-data/dms/config | ||||||
|  |     state: directory | ||||||
|  |     owner: root | ||||||
|  |     group: root | ||||||
|  |     mode: 0700 | ||||||
|  | 
 | ||||||
|  | - name: Ensure mail entries volume exist with correct permission | ||||||
|  |   file: | ||||||
|  |     path: /etc/docker/compose/mail/docker-data/dms/mail-data/ | ||||||
|  |     state: directory | ||||||
|  |     owner: root | ||||||
|  |     group: root | ||||||
|  |     mode: 0777 | ||||||
|  |     recurse: true | ||||||
|  | 
 | ||||||
|  | - name: Ensure dovecot ldap config exist | ||||||
|  |   ansible.builtin.template: | ||||||
|  |     src: user-patches.sh.j2 | ||||||
|  |     dest: /etc/docker/compose/mail/docker-data/dms/config/user-patches.sh | ||||||
|  |     owner: root | ||||||
|  |     group: root | ||||||
|  |     mode: 0755 | ||||||
|  | 
 | ||||||
|  | - name: Ensure config user overrides config exist | ||||||
|  |   ansible.builtin.template: | ||||||
|  |     src: dovecot-ldap.conf.j2 | ||||||
|  |     dest: /etc/docker/compose/mail/docker-data/dms/config/dovecot-ldap.conf | ||||||
|  |     owner: root | ||||||
|  |     group: root | ||||||
|  |     mode: 0700 | ||||||
|  | 
 | ||||||
|  | - name: Build mail docker-compose.yml.j2 | ||||||
|  |   ansible.builtin.template: | ||||||
|  |     src: docker-compose.yml.j2 | ||||||
|  |     dest: /etc/docker/compose/mail/docker-compose.yml | ||||||
|  |     owner: root | ||||||
|  |     group: root | ||||||
|  |     mode: 0700 | ||||||
|  | 
 | ||||||
|  | - name: Daemon-reload and enable mail | ||||||
|  |   ansible.builtin.systemd_service: | ||||||
|  |     state: restarted | ||||||
|  |     enabled: true | ||||||
|  |     name: docker-compose@mail | ||||||
|  | @ -0,0 +1,45 @@ | ||||||
|  | services: | ||||||
|  |   mailserver: | ||||||
|  |     image: ghcr.io/docker-mailserver/docker-mailserver:latest | ||||||
|  |     container_name: mailserver | ||||||
|  |     hostname: {{ mail_domain }} | ||||||
|  |     ports: | ||||||
|  |       - "0.0.0.0:25:25" | ||||||
|  |       - "0.0.0.0:465:465" | ||||||
|  |       - "0.0.0.0:587:587" | ||||||
|  |       - "0.0.0.0:993:993" | ||||||
|  |     volumes: | ||||||
|  |       - ./docker-data/dms/mail-data/:/var/mail/ | ||||||
|  |       - ./docker-data/dms/mail-state/:/var/mail-state/ | ||||||
|  |       - ./docker-data/dms/mail-logs/:/var/log/mail/ | ||||||
|  |       - ./docker-data/dms/config/:/tmp/docker-mailserver/ | ||||||
|  |       - ./docker-data/dms/config/dovecot-ldap.conf:/etc/dovecot/dovecot-ldap.conf.ext | ||||||
|  |       - /etc/letsencrypt:/etc/letsencrypt:ro | ||||||
|  |       - /etc/localtime:/etc/localtime:ro | ||||||
|  |     environment: | ||||||
|  |       - SSL_TYPE=letsencrypt | ||||||
|  |       - ENABLE_CLAMAV=1 | ||||||
|  |       - ENABLE_AMAVIS=1 | ||||||
|  |       - ENABLE_FAIL2BAN=1 | ||||||
|  |       - ENABLE_SASLAUTHD=1 | ||||||
|  |       - ENABLE_POSTGREY=0 | ||||||
|  | 
 | ||||||
|  |       - SPOOF_PROTECTION=1 | ||||||
|  |       - ACCOUNT_PROVISIONER=LDAP | ||||||
|  |       - LDAP_SERVER_HOST={{ ldap_server_host }} | ||||||
|  |       - LDAP_SEARCH_BASE={{ ldap_search_base }} | ||||||
|  |       - LDAP_BIND_DN={{ ldap_bind_dn }} | ||||||
|  |       - LDAP_BIND_PW={{ email_ldap_api_token }} | ||||||
|  | 
 | ||||||
|  |       - LDAP_QUERY_FILTER_USER={{ ldap_query_filter_user }} | ||||||
|  |       - LDAP_QUERY_FILTER_GROUP={{ ldap_query_filter_group }} | ||||||
|  |       - LDAP_QUERY_FILTER_ALIAS={{ ldap_query_filter_alias }} | ||||||
|  |       - LDAP_QUERY_FILTER_DOMAIN={{ ldap_query_filter_domain }} | ||||||
|  |       - LDAP_QUERY_FILTER_SENDERS={{ ldap_query_filter_senders }} | ||||||
|  | 
 | ||||||
|  |       - POSTMASTER_ADDRESS={{ postmaster_email }} | ||||||
|  | 
 | ||||||
|  |       - ENABLE_SASLAUTHD=1 | ||||||
|  |       - SASLAUTHD_MECHANISMS=ldap | ||||||
|  |       - SASLAUTHD_LDAP_FILTER={{ sasl_ldap_filter }}  | ||||||
|  |     restart: always | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | base = {{ ldap_search_base }} | ||||||
|  | uris = {{ ldap_server_host }} | ||||||
|  | tls = no | ||||||
|  | ldap_version = 3 | ||||||
|  | default_pass_scheme = SSHA | ||||||
|  | 
 | ||||||
|  | auth_bind = yes | ||||||
|  | auth_bind_userdn = {{ dovecot_auth_bind_userdn }} | ||||||
|  | user_filter = {{ dovecot_user_filter }} | ||||||
|  | user_attrs = {{ dovecot_user_attrs }} | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | postconf -e 'smtpd_sasl_auth_enable = yes' | ||||||
|  | 
 | ||||||
|  | postconf -e 'smtpd_sasl_type = dovecot' | ||||||
|  | postconf -e 'smtpd_sasl_path = /dev/shm/sasl-auth.sock' | ||||||
|  | postconf -e 'smtpd_sasl_auth_enable = yes' | ||||||
|  | postconf -e 'broken_sasl_auth_clients = yes' | ||||||
|  | 
 | ||||||
|  | echo 'auth_username_format = %Ln' >> /etc/dovecot/conf.d/10-auth.conf | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | server { | ||||||
|  |   listen 80; | ||||||
|  |   server_name mail.hatecomputers.club; | ||||||
|  | 
 | ||||||
|  |   location / { | ||||||
|  |     rewrite ^ https://mail.hatecomputers.club$request_uri? permanent; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | server { | ||||||
|  |   server_name mail.hatecomputers.club; | ||||||
|  |   listen 443 ssl; | ||||||
|  | 
 | ||||||
|  |   ssl_dhparam /etc/nginx/dhparams.pem; | ||||||
|  |    | ||||||
|  |   ssl_session_timeout 1d; | ||||||
|  |   ssl_session_tickets off; | ||||||
|  |   ssl_protocols TLSv1.2 TLSv1.3; | ||||||
|  |   ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; | ||||||
|  |   ssl_prefer_server_ciphers off; | ||||||
|  | 
 | ||||||
|  |   ssl_certificate /etc/letsencrypt/live/mail.hatecomputers.club/fullchain.pem; | ||||||
|  |   ssl_certificate_key /etc/letsencrypt/live/mail.hatecomputers.club/privkey.pem; | ||||||
|  | 
 | ||||||
|  |   location / { | ||||||
|  |     proxy_pass         http://127.0.0.1:8331; | ||||||
|  |     proxy_set_header   X-Real-IP $remote_addr; | ||||||
|  |     proxy_set_header   Host $host; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -1,2 +1,3 @@ | ||||||
| cloudflare_api_token | cloudflare_api_token | ||||||
| certbot_email | certbot_email | ||||||
|  | email_ldap_api_token | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue