added Malcolm
This commit is contained in:
		
							
								
								
									
										3
									
								
								Vagrant/resources/malcolm/nginx/ca-trust/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Vagrant/resources/malcolm/nginx/ca-trust/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| * | ||||
| !.gitignore | ||||
|  | ||||
							
								
								
									
										3
									
								
								Vagrant/resources/malcolm/nginx/certs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Vagrant/resources/malcolm/nginx/certs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| * | ||||
| !.gitignore | ||||
|  | ||||
							
								
								
									
										1
									
								
								Vagrant/resources/malcolm/nginx/htpasswd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Vagrant/resources/malcolm/nginx/htpasswd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| vagrant:$2y$05$EKbzasbwZS/S9cM71hCvsulXyvGObG6fTS3h04MwmwOe4C7P1Zk3C | ||||
							
								
								
									
										308
									
								
								Vagrant/resources/malcolm/nginx/nginx.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								Vagrant/resources/malcolm/nginx/nginx.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,308 @@ | ||||
| # Copyright (c) 2021 Battelle Energy Alliance, LLC.  All rights reserved. | ||||
|  | ||||
| daemon off; | ||||
|  | ||||
| worker_processes 1; | ||||
|  | ||||
| events { worker_connections 1024; } | ||||
|  | ||||
| http { | ||||
|  | ||||
|   include /etc/nginx/mime.types; | ||||
|   sendfile on; | ||||
|  | ||||
|   client_max_body_size 20m; | ||||
|  | ||||
|   fastcgi_buffers 16 64k; | ||||
|   fastcgi_buffer_size 256k; | ||||
|   fastcgi_read_timeout 300s; | ||||
|   fastcgi_busy_buffers_size 384k; | ||||
|   fastcgi_request_buffering off; | ||||
|  | ||||
|   proxy_connect_timeout 180s; | ||||
|   proxy_read_timeout 300s; | ||||
|   proxy_send_timeout 300s; | ||||
|   proxy_buffer_size 512k; | ||||
|   proxy_buffers 16 4m; | ||||
|   proxy_busy_buffers_size 16m; | ||||
|  | ||||
|   # if LDAP authentication is enabled, this will configure the ldap_server section | ||||
|   include /etc/nginx/nginx_ldap_rt.conf; | ||||
|  | ||||
|   upstream docker-arkime { | ||||
|     server arkime:8005; | ||||
|   } | ||||
|  | ||||
|   upstream docker-malcolm-readme { | ||||
|     server arkime:8000; | ||||
|   } | ||||
|  | ||||
|   upstream docker-upload { | ||||
|     server upload:80; | ||||
|   } | ||||
|  | ||||
|   upstream docker-htadmin { | ||||
|     server htadmin:80; | ||||
|   } | ||||
|  | ||||
|   upstream docker-kibana { | ||||
|     server kibana:5601; | ||||
|   } | ||||
|  | ||||
|   upstream docker-kibana-maps { | ||||
|     server kibana-helper:28991; | ||||
|   } | ||||
|  | ||||
|   upstream docker-elasticsearch { | ||||
|     server elasticsearch:9200; | ||||
|   } | ||||
|  | ||||
|   upstream docker-logstash-stats { | ||||
|     server logstash:9600; | ||||
|   } | ||||
|  | ||||
|   upstream docker-name-map-ui { | ||||
|     server name-map-ui:8080; | ||||
|   } | ||||
|  | ||||
|   upstream docker-extracted-file-http-server { | ||||
|     server file-monitor:8440; | ||||
|   } | ||||
|  | ||||
|   # htadmin (htpasswd/user management) | ||||
|   server { | ||||
|     listen 488 ssl; | ||||
|     ssl_certificate /etc/nginx/certs/cert.pem; | ||||
|     ssl_certificate_key /etc/nginx/certs/key.pem; | ||||
|  | ||||
|     location / { | ||||
|       proxy_pass http://docker-htadmin; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host htadmin.malcolm.local; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   # Arkime interface | ||||
|   server { | ||||
|     listen 443 ssl; | ||||
|     ssl_certificate /etc/nginx/certs/cert.pem; | ||||
|     ssl_certificate_key /etc/nginx/certs/key.pem; | ||||
|  | ||||
|     # use either auth_basic or auth_ldap | ||||
|     include /etc/nginx/nginx_auth_rt.conf; | ||||
|  | ||||
|     # Malcolm readme | ||||
|     location /readme { | ||||
|       proxy_pass http://docker-malcolm-readme/README.html; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host arkime.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # Malcolm file upload | ||||
|     location /upload { | ||||
|       proxy_http_version 1.1; | ||||
|       proxy_set_header Connection ""; | ||||
|       proxy_pass http://docker-upload/; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host upload.malcolm.local; | ||||
|       proxy_request_buffering off; | ||||
|       proxy_buffering off; | ||||
|       client_max_body_size 20G; | ||||
|     } | ||||
|     location /server/php { | ||||
|       proxy_http_version 1.1; | ||||
|       proxy_set_header Connection ""; | ||||
|       proxy_pass http://docker-upload/server/php/; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host upload.malcolm.local; | ||||
|       proxy_request_buffering off; | ||||
|       proxy_buffering off; | ||||
|       client_max_body_size 20G; | ||||
|     } | ||||
|  | ||||
|     # Logstash statistics | ||||
|     location ~* ^/logstash\b(.*) { | ||||
|       proxy_pass http://docker-logstash-stats/_node/stats$1; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host arkime.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # Arkime -> Kibana shortcut | ||||
|     location ~* ^/idmol2kib(.*) { | ||||
|  | ||||
|       set $filter_start_time now-1d; | ||||
|       if ($arg_start != '') { | ||||
|         set $filter_start_time \'$arg_start\'; | ||||
|       } | ||||
|  | ||||
|       set $filter_stop_time now; | ||||
|       if ($arg_stop != '') { | ||||
|         set $filter_stop_time \'$arg_stop\'; | ||||
|       } | ||||
|  | ||||
|       set $filter_field undefined; | ||||
|       if ($arg_field != '') { | ||||
|         set $filter_field $arg_field; | ||||
|       } | ||||
|  | ||||
|       set $filter_value undefined; | ||||
|       if ($arg_value != '') { | ||||
|         set $filter_value $arg_value; | ||||
|       } | ||||
|  | ||||
|       rewrite ^/idmol2kib/(.*) /kibana/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:$filter_start_time,mode:absolute,to:$filter_stop_time))&_a=(columns:!(_source),filters:!((meta:(alias:!n,disabled:!f,index:'sessions2-*',key:$filter_field,negate:!f,params:(query:'$filter_value',type:phrase),type:phrase,value:'$filter_value'),query:(match:($filter_field:(query:'$filter_value',type:phrase))))),index:'sessions2-*',interval:auto,query:(language:lucene,query:''),sort:!(firstPacket,desc)) redirect; | ||||
|       proxy_pass http://docker-kibana; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host kibana.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # Kibana -> Arkime shortcut | ||||
|     location ~* /idkib2mol/(.*) { | ||||
|       rewrite ^.*/idkib2mol/(.*) /sessions?expression=($1) redirect; | ||||
|       proxy_pass http://docker-arkime; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host arkime.malcolm.local; | ||||
|       proxy_set_header http_auth_http_user $remote_user; | ||||
|       proxy_set_header Authorization ""; | ||||
|     } | ||||
|  | ||||
|     # Kibana/Arkime -> extracted file download | ||||
|     location ~* /dl-extracted-files/(.*) { | ||||
|       rewrite ^.*/dl-extracted-files/(.*) /extracted-files/$1 redirect; | ||||
|       proxy_pass http://docker-extracted-file-http-server; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host file-monitor.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # already prepended /kibana to match the server.basePath in kibana's YML config file | ||||
|     location /kibana { | ||||
|       proxy_pass http://docker-kibana; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host kibana.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # otherwise (from old kibana bookmarks), prepend /kibana to match the server.basePath in kibana's YML config file | ||||
|     location /app { | ||||
|       proxy_pass http://docker-kibana/kibana/app; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host kibana.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # offline region maps for kibana | ||||
|     location /world.geojson { | ||||
|       proxy_pass http://docker-kibana-maps; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host kibana-helper.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # name-map-ui (UI for mapping names to network hosts and subnets) | ||||
|     location /name-map-ui { | ||||
|       proxy_pass http://docker-name-map-ui/; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host name-map-ui.malcolm.local; | ||||
|       proxy_cache off; | ||||
|     } | ||||
|  | ||||
|     location ~* ^/extracted-files\b(.*) { | ||||
|       proxy_pass http://docker-extracted-file-http-server$1; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host file-monitor.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     location = /favicon.ico { | ||||
|       alias /etc/nginx/favicon.ico; | ||||
|     } | ||||
|  | ||||
|     # Fix cyberchef JS module(s) | ||||
|     # https://localhost/moloch/session/190924-KgO9H30qhdREw7ltsDXn1Rgp/modules/Regex.js | ||||
|     location ~* ^/moloch/session/.*/(modules/.*\.js) { | ||||
|       proxy_hide_header Content-Type; | ||||
|       proxy_set_header Content-Type "application/javascript"; | ||||
|       add_header Content-Type "application/javascript"; | ||||
|       default_type application/javascript; | ||||
|       add_header X-Content-Type-Options 'nosniff'; | ||||
|       proxy_pass http://docker-arkime/cyberchef/$1; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host arkime.malcolm.local; | ||||
|       proxy_set_header http_auth_http_user $remote_user; | ||||
|       proxy_set_header Authorization ""; | ||||
|     } | ||||
|  | ||||
|     location / { | ||||
|       proxy_pass http://docker-arkime; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host arkime.malcolm.local; | ||||
|       proxy_set_header http_auth_http_user $remote_user; | ||||
|       proxy_set_header Authorization ""; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   # Kibana interface | ||||
|   server { | ||||
|     listen 5601 ssl; | ||||
|     ssl_certificate /etc/nginx/certs/cert.pem; | ||||
|     ssl_certificate_key /etc/nginx/certs/key.pem; | ||||
|  | ||||
|     # use either auth_basic or auth_ldap | ||||
|     include /etc/nginx/nginx_auth_rt.conf; | ||||
|  | ||||
|     location = /favicon.ico { | ||||
|       alias /etc/nginx/favicon.ico; | ||||
|     } | ||||
|  | ||||
|     # Kibana -> Arkime shortcut | ||||
|     location ~* /idkib2mol/(.*) { | ||||
|       rewrite ^.*/idkib2mol/(.*) /sessions?expression=($1) redirect; | ||||
|       proxy_pass http://docker-arkime; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host arkime.malcolm.local; | ||||
|       proxy_set_header http_auth_http_user $remote_user; | ||||
|       proxy_set_header Authorization ""; | ||||
|     } | ||||
|  | ||||
|     # Kibana -> extracted file download | ||||
|     location ~* /dl-extracted-files/(.*) { | ||||
|       rewrite ^.*/dl-extracted-files/(.*) /extracted-files/$1 redirect; | ||||
|       proxy_pass http://docker-extracted-file-http-server; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host file-monitor.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # already prepended /kibana to match the server.basePath in kibana's YML config file | ||||
|     location /kibana { | ||||
|       proxy_pass http://docker-kibana; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host kibana.malcolm.local; | ||||
|     } | ||||
|  | ||||
|     # otherwise prepend /kibana to match the server.basePath in kibana's YML config file | ||||
|     location / { | ||||
|       rewrite ^/(.*) /kibana/$1; | ||||
|       proxy_pass http://docker-kibana; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host kibana.malcolm.local; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   # Elasticsearch API | ||||
|   server { | ||||
|     listen 9200 ssl; | ||||
|     ssl_certificate /etc/nginx/certs/cert.pem; | ||||
|     ssl_certificate_key /etc/nginx/certs/key.pem; | ||||
|  | ||||
|     # use either auth_basic or auth_ldap | ||||
|     include /etc/nginx/nginx_auth_rt.conf; | ||||
|  | ||||
|     location = /favicon.ico { | ||||
|       alias /etc/nginx/favicon.ico; | ||||
|     } | ||||
|  | ||||
|     location / { | ||||
|       proxy_pass http://docker-elasticsearch; | ||||
|       proxy_redirect off; | ||||
|       proxy_set_header Host es.malcolm.local; | ||||
|       client_max_body_size 50m; | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										2
									
								
								Vagrant/resources/malcolm/nginx/nginx_auth_basic.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								Vagrant/resources/malcolm/nginx/nginx_auth_basic.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| auth_basic "Authentication Required"; | ||||
| auth_basic_user_file /etc/nginx/.htpasswd; | ||||
							
								
								
									
										2
									
								
								Vagrant/resources/malcolm/nginx/nginx_auth_ldap.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								Vagrant/resources/malcolm/nginx/nginx_auth_ldap.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| auth_ldap "LDAP Authentication Required"; | ||||
| auth_ldap_servers ad_server; | ||||
							
								
								
									
										20
									
								
								Vagrant/resources/malcolm/nginx/nginx_ldap.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Vagrant/resources/malcolm/nginx/nginx_ldap.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| # This is a sample configuration for the ldap_server section of nginx.conf. | ||||
| # Yours will vary depending on how your Active Directory/LDAP server is configured. | ||||
| # See https://github.com/kvspb/nginx-auth-ldap#available-config-parameters for options. | ||||
|  | ||||
| ldap_server ad_server { | ||||
|   url "ldap://ds.example.com:3268/DC=example,DC=com?sAMAccountName?sub?(objectClass=person)"; | ||||
|  | ||||
|   binddn "bind_dn"; | ||||
|   binddn_passwd "bind_dn_password"; | ||||
|  | ||||
|   group_attribute member; | ||||
|   group_attribute_is_dn on; | ||||
|   require group "CN=malcolm,OU=groups,DC=example,DC=com"; | ||||
|   require valid_user; | ||||
|   satisfy all; | ||||
| } | ||||
|  | ||||
| auth_ldap_cache_enabled on; | ||||
| auth_ldap_cache_expiration_time 10000; | ||||
| auth_ldap_cache_size 1000; | ||||
							
								
								
									
										212
									
								
								Vagrant/resources/malcolm/nginx/scripts/docker_entrypoint.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										212
									
								
								Vagrant/resources/malcolm/nginx/scripts/docker_entrypoint.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,212 @@ | ||||
| #!/bin/bash | ||||
| set -e | ||||
|  | ||||
| # Warn if the DOCKER_HOST socket does not exist | ||||
| if [[ $DOCKER_HOST = unix://* ]]; then | ||||
|   socket_file=${DOCKER_HOST#unix://} | ||||
|   if ! [ -S $socket_file ]; then | ||||
|     cat >&2 <<-EOT | ||||
|   ERROR: you need to share your Docker host socket with a volume at $socket_file | ||||
|   Typically you should run your container with: \`-v /var/run/docker.sock:$socket_file:ro\` | ||||
|   See the jwilder/nginx-proxy documentation at http://git.io/vZaGJ | ||||
| EOT | ||||
|     socketMissing=1 | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| # Compute the DNS resolvers for use in the templates - if the IP contains ":", it's IPv6 and must be enclosed in [] | ||||
| export RESOLVERS=$(awk '$1 == "nameserver" {print ($2 ~ ":")? "["$2"]": $2}' ORS=' ' /etc/resolv.conf | sed 's/ *$//g') | ||||
| if [ "x$RESOLVERS" = "x" ]; then | ||||
|     echo "Warning: unable to determine DNS resolvers for nginx" >&2 | ||||
|     unset RESOLVERS | ||||
| fi | ||||
|  | ||||
| # If the user has run the default command and the socket doesn't exist, fail | ||||
| if [ "$socketMissing" = 1 -a "$1" = 'supervisord' -a "$2" = '-c' -a "$3" = '/etc/supervisord.conf' ]; then | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| # set up for NGINX HTTP basic vs. LDAP/LDAPS/LDAP+StartTLS auth | ||||
|  | ||||
| # a blank file just to use as an "include" placeholder for the nginx's LDAP config when LDAP is not used | ||||
| NGINX_BLANK_CONF=/etc/nginx/nginx_blank.conf | ||||
|  | ||||
| # "include" file for auth_basic, prompt, and .htpasswd location | ||||
| NGINX_BASIC_AUTH_CONF=/etc/nginx/nginx_auth_basic.conf | ||||
|  | ||||
| # "include" file for auth_ldap, prompt, and "auth_ldap_servers" name | ||||
| NGINX_LDAP_AUTH_CONF=/etc/nginx/nginx_auth_ldap.conf | ||||
|  | ||||
| # volume-mounted user configuration containing "ldap_server ad_server" section with URL, binddn, etc. | ||||
| NGINX_LDAP_USER_CONF=/etc/nginx/nginx_ldap.conf | ||||
|  | ||||
| # runtime "include" file for auth method (link to either NGINX_BASIC_AUTH_CONF or NGINX_LDAP_AUTH_CONF) | ||||
| NGINX_RUNTIME_AUTH_CONF=/etc/nginx/nginx_auth_rt.conf | ||||
|  | ||||
| # runtime "include" file for ldap config (link to either NGINX_BLANK_CONF or (possibly modified) NGINX_LDAP_USER_CONF) | ||||
| NGINX_RUNTIME_LDAP_CONF=/etc/nginx/nginx_ldap_rt.conf | ||||
|  | ||||
| # config file for stunnel if using stunnel to issue LDAP StartTLS function | ||||
| STUNNEL_CONF=/etc/stunnel/stunnel.conf | ||||
|  | ||||
| CA_TRUST_HOST_DIR=/etc/nginx/ca-trust | ||||
| CA_TRUST_RUN_DIR=/var/run/ca-trust | ||||
|  | ||||
| # copy trusted CA certs to runtime directory and c_rehash them to create symlinks | ||||
| STUNNEL_CA_PATH_LINE="" | ||||
| STUNNEL_VERIFY_LINE="" | ||||
| STUNNEL_CHECK_HOST_LINE="" | ||||
| STUNNEL_CHECK_IP_LINE="" | ||||
| NGINX_LDAP_CA_PATH_LINE="" | ||||
| NGINX_LDAP_CHECK_REMOTE_CERT_LINE="" | ||||
| mkdir -p "$CA_TRUST_RUN_DIR" | ||||
| # attempt to make sure trusted CA certs dir is readable by unprivileged nginx worker | ||||
| chmod 755 "$CA_TRUST_RUN_DIR" || true | ||||
| CA_FILES=$(shopt -s nullglob dotglob; echo "$CA_TRUST_HOST_DIR"/*) | ||||
| if (( ${#CA_FILES} )) ; then | ||||
|   rm -f "$CA_TRUST_RUN_DIR"/* | ||||
|   pushd "$CA_TRUST_RUN_DIR" >/dev/null 2>&1 | ||||
|   if cp "$CA_TRUST_HOST_DIR"/* ./ ; then | ||||
|  | ||||
|     # attempt to make sure trusted CA certs are readable by unprivileged nginx worker | ||||
|     chmod 644 * || true | ||||
|  | ||||
|     # create hash symlinks | ||||
|     c_rehash -compat . | ||||
|  | ||||
|     # variables for stunnel config | ||||
|     STUNNEL_CA_PATH_LINE="CApath = $CA_TRUST_RUN_DIR" | ||||
|     [[ -n $NGINX_LDAP_TLS_STUNNEL_VERIFY_LEVEL ]] && STUNNEL_VERIFY_LINE="verify = $NGINX_LDAP_TLS_STUNNEL_VERIFY_LEVEL" || STUNNEL_VERIFY_LINE="verify = 2" | ||||
|     [[ -n $NGINX_LDAP_TLS_STUNNEL_CHECK_HOST ]] && STUNNEL_CHECK_HOST_LINE="checkHost = $NGINX_LDAP_TLS_STUNNEL_CHECK_HOST" | ||||
|     [[ -n $NGINX_LDAP_TLS_STUNNEL_CHECK_IP ]] && STUNNEL_CHECK_IP_LINE="checkIP = $NGINX_LDAP_TLS_STUNNEL_CHECK_IP" | ||||
|  | ||||
|     # variables for nginx config | ||||
|     NGINX_LDAP_CA_PATH_LINE="  ssl_ca_dir $CA_TRUST_RUN_DIR;" | ||||
|     ( [[ -n $NGINX_LDAP_TLS_STUNNEL_CHECK_HOST ]] || [[ -n $NGINX_LDAP_TLS_STUNNEL_CHECK_IP ]] ) && NGINX_LDAP_CHECK_REMOTE_CERT_LINE="  ssl_check_cert on;" || NGINX_LDAP_CHECK_REMOTE_CERT_LINE="  ssl_check_cert chain;" | ||||
|   fi | ||||
|   popd >/dev/null 2>&1 | ||||
| fi | ||||
|  | ||||
| if [[ -z $NGINX_BASIC_AUTH ]] || [[ "$NGINX_BASIC_AUTH" == "true" ]]; then | ||||
|   # doing HTTP basic auth instead of ldap | ||||
|  | ||||
|   # point nginx_auth_rt.conf to nginx_auth_basic.conf | ||||
|   ln -sf "$NGINX_BASIC_AUTH_CONF" "$NGINX_RUNTIME_AUTH_CONF" | ||||
|  | ||||
|   # ldap configuration is empty | ||||
|   ln -sf "$NGINX_BLANK_CONF" "$NGINX_RUNTIME_LDAP_CONF" | ||||
|  | ||||
| else | ||||
|   # point nginx_auth_rt.conf to nginx_auth_ldap.conf | ||||
|   ln -sf "$NGINX_LDAP_AUTH_CONF" "$NGINX_RUNTIME_AUTH_CONF" | ||||
|  | ||||
|   # parse URL information out of user ldap configuration | ||||
|   # example: | ||||
|   #   url "ldap://localhost:3268/DC=ds,DC=example,DC=com?sAMAccountName?sub?(objectClass=person)"; | ||||
|   #             "url"    quote protocol h/p    uri | ||||
|   #             ↓        ↓     ↓        ↓      ↓ | ||||
|   PATTERN='^(\s*url\s+)([''"]?)(\w+)://([^/]+)(/.*)$' | ||||
|  | ||||
|   unset HEADER | ||||
|   unset OPEN_QUOTE | ||||
|   unset PROTOCOL | ||||
|   unset REMOTE_HOST | ||||
|   unset REMOTE_PORT | ||||
|   unset URI_TO_END | ||||
|  | ||||
|   URL_LINE_NUM=0 | ||||
|   READ_LINE_NUM=0 | ||||
|   while IFS= read -r LINE; do | ||||
|     READ_LINE_NUM=$((READ_LINE_NUM+1)) | ||||
|     if [[ $LINE =~ $PATTERN ]]; then | ||||
|       URL_LINE_NUM=$READ_LINE_NUM | ||||
|       HEADER=${BASH_REMATCH[1]} | ||||
|       OPEN_QUOTE=${BASH_REMATCH[2]} | ||||
|       PROTOCOL=${BASH_REMATCH[3]} | ||||
|       REMOTE=${BASH_REMATCH[4]} | ||||
|       REMOTE_ARR=(${REMOTE//:/ }) | ||||
|       [[ -n ${REMOTE_ARR[0]} ]] && REMOTE_HOST=${REMOTE_ARR[0]} | ||||
|       [[ -n ${REMOTE_ARR[1]} ]] && REMOTE_PORT=${REMOTE_ARR[1]} || REMOTE_PORT=3268 | ||||
|       URI_TO_END=${BASH_REMATCH[5]} | ||||
|       break | ||||
|     fi | ||||
|   done < "$NGINX_LDAP_USER_CONF" | ||||
|  | ||||
|   if [[ "$NGINX_LDAP_TLS_STUNNEL" == "true" ]]; then | ||||
|     # user provided LDAP configuration, but we need to tweak it and set up stunnel to issue StartTLS | ||||
|  | ||||
|     if [[ -z $REMOTE_HOST ]]; then | ||||
|       # missing LDAP info needed to configure tunnel, abort | ||||
|       exit 1 | ||||
|     fi | ||||
|  | ||||
|     # pick a random local port to listen on for the client side of the tunnel | ||||
|     read PORT_LOWER POWER_UPPER < /proc/sys/net/ipv4/ip_local_port_range | ||||
|     LOCAL_PORT=$(shuf -i $PORT_LOWER-$POWER_UPPER -n 1) | ||||
|  | ||||
|     # create PEM key for stunnel (this key doesn't matter as we're only using stunnel in client mode) | ||||
|     pushd /tmp >/dev/null 2>&1 | ||||
|     openssl genrsa -out key.pem 2048 | ||||
|     openssl req -new -x509 -key key.pem -out cert.pem -days 3650 -subj "/CN=$(hostname)/O=Malcolm/C=US" | ||||
|     cat key.pem cert.pem > /etc/stunnel/stunnel.pem | ||||
|     chmod 600 /etc/stunnel/stunnel.pem | ||||
|     rm -f key.pem cert.pem | ||||
|     popd >/dev/null 2>&1 | ||||
|  | ||||
|     # configure stunnel | ||||
|     cat <<EOF > "$STUNNEL_CONF" | ||||
| setuid = nginx | ||||
| setgid = nginx | ||||
| pid = /tmp/stunnel.pid | ||||
| socket = l:TCP_NODELAY=1 | ||||
| socket = r:TCP_NODELAY=1 | ||||
| client = yes | ||||
| foreground = yes | ||||
| cert = /etc/stunnel/stunnel.pem | ||||
| $STUNNEL_CA_PATH_LINE | ||||
| $STUNNEL_VERIFY_LINE | ||||
| $STUNNEL_CHECK_HOST_LINE | ||||
| $STUNNEL_CHECK_IP_LINE | ||||
|  | ||||
| [stunnel.ldap_start_tls] | ||||
| accept = localhost:$LOCAL_PORT | ||||
| connect = $REMOTE_HOST:$REMOTE_PORT | ||||
| protocol = ldap | ||||
| EOF | ||||
|  | ||||
|     # rewrite modified copy of user ldap configuration to point to local end of tunnel instead of remote | ||||
|     rm -f "$NGINX_RUNTIME_LDAP_CONF" | ||||
|     touch "$NGINX_RUNTIME_LDAP_CONF" | ||||
|     chmod 600 "$NGINX_RUNTIME_LDAP_CONF" | ||||
|     READ_LINE_NUM=0 | ||||
|     while IFS= read -r LINE; do | ||||
|       READ_LINE_NUM=$((READ_LINE_NUM+1)) | ||||
|       if (( $URL_LINE_NUM == $READ_LINE_NUM )); then | ||||
|         echo "${HEADER}${OPEN_QUOTE}ldap://localhost:${LOCAL_PORT}${URI_TO_END}" >> "$NGINX_RUNTIME_LDAP_CONF" | ||||
|       else | ||||
|         echo "$LINE" >> "$NGINX_RUNTIME_LDAP_CONF" | ||||
|       fi | ||||
|     done < "$NGINX_LDAP_USER_CONF" | ||||
|  | ||||
|   else | ||||
|     # we're doing either LDAP or LDAPS, but not StartTLS, so we don't need to use stunnel. | ||||
|     # however, we do want to set SSL CA trust stuff if specified, so do that | ||||
|     rm -f "$NGINX_RUNTIME_LDAP_CONF" | ||||
|     touch "$NGINX_RUNTIME_LDAP_CONF" | ||||
|     chmod 600 "$NGINX_RUNTIME_LDAP_CONF" | ||||
|     READ_LINE_NUM=0 | ||||
|     while IFS= read -r LINE; do | ||||
|       READ_LINE_NUM=$((READ_LINE_NUM+1)) | ||||
|       echo "$LINE" >> "$NGINX_RUNTIME_LDAP_CONF" | ||||
|       if (( $URL_LINE_NUM == $READ_LINE_NUM )); then | ||||
|         echo "$NGINX_LDAP_CHECK_REMOTE_CERT_LINE" >> "$NGINX_RUNTIME_LDAP_CONF" | ||||
|         echo "$NGINX_LDAP_CA_PATH_LINE" >> "$NGINX_RUNTIME_LDAP_CONF" | ||||
|       fi | ||||
|     done < "$NGINX_LDAP_USER_CONF" | ||||
|  | ||||
|   fi # stunnel/starttls vs. ldap/ldaps | ||||
|  | ||||
| fi # basic vs. ldap | ||||
|  | ||||
| # start supervisor (which will spawn nginx, stunnel, etc.) or whatever the default command is | ||||
| exec "$@" | ||||
							
								
								
									
										64
									
								
								Vagrant/resources/malcolm/nginx/supervisord.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								Vagrant/resources/malcolm/nginx/supervisord.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| ; Copyright (c) 2021 Battelle Energy Alliance, LLC.  All rights reserved. | ||||
|  | ||||
| [unix_http_server] | ||||
| file=/tmp/supervisor.sock   ; (the path to the socket file) | ||||
| chmod=0700 | ||||
|  | ||||
| [supervisord] | ||||
| nodaemon=true | ||||
| logfile=/dev/null | ||||
| logfile_maxbytes=0 | ||||
| pidfile=/tmp/supervisord.pid | ||||
|  | ||||
| [rpcinterface:supervisor] | ||||
| supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface | ||||
|  | ||||
| [supervisorctl] | ||||
| serverurl=unix:///tmp/supervisor.sock | ||||
|  | ||||
| [program:nginx] | ||||
| command=/usr/sbin/nginx | ||||
| startsecs=10 | ||||
| startretries=2000000000 | ||||
| stopasgroup=true | ||||
| killasgroup=true | ||||
| stdout_logfile=/dev/fd/1 | ||||
| stdout_logfile_maxbytes=0 | ||||
| redirect_stderr=true | ||||
|  | ||||
| [program:logaccess] | ||||
| command=/usr/bin/tail -F /var/log/nginx/access.log | ||||
| user=%(ENV_PUSER)s | ||||
| startsecs=10 | ||||
| startretries=2000000000 | ||||
| stopasgroup=true | ||||
| killasgroup=true | ||||
| stdout_logfile=/dev/fd/1 | ||||
| stdout_logfile_maxbytes=0 | ||||
| stderr_logfile=/dev/null | ||||
| stdout_logfile_maxbytes=0 | ||||
| redirect_stderr=false | ||||
|  | ||||
| [program:logerrors] | ||||
| command=/usr/bin/tail -F /var/log/nginx/error.log | ||||
| user=%(ENV_PUSER)s | ||||
| startsecs=10 | ||||
| startretries=2000000000 | ||||
| stopasgroup=true | ||||
| killasgroup=true | ||||
| stdout_logfile=/dev/fd/1 | ||||
| stdout_logfile_maxbytes=0 | ||||
| stderr_logfile=/dev/null | ||||
| stdout_logfile_maxbytes=0 | ||||
| redirect_stderr=false | ||||
|  | ||||
| [program:stunnel] | ||||
| command=/usr/bin/stunnel /etc/stunnel/stunnel.conf | ||||
| startsecs=10 | ||||
| startretries=2000000000 | ||||
| stopasgroup=true | ||||
| killasgroup=true | ||||
| stdout_logfile=/dev/fd/1 | ||||
| stdout_logfile_maxbytes=0 | ||||
| redirect_stderr=true | ||||
| autostart=%(ENV_NGINX_LDAP_TLS_STUNNEL)s | ||||
		Reference in New Issue
	
	Block a user