Install MISP with Podman and SELinux
Jump to navigation
Jump to search
Contents
1 Setup Notes v2.4.195
- This is my working note to setup docker-based misp setup.
- Please feel free to add a wiki on this page.
- Consider that compiling any docker images in production is not allowed and not in focus of this document.
- CAP_AUDIT_WRITE and TAG_vars may get integrated natively later on.
- Ability to get ALL docker volumes persistent and located on one specific point is desirable, my approach is probably not best, but clean.
Cheers, Chris
1.1 Prepare / Proceed
- Setup Rocky 9 minimal.
- Prepare Settings as needed in vars below.
- Carefully place commands: understand, apply, verify.
- Test.
1.2 Outcome
- Docker-based misp setup.
- SELinux enabled.
- Independent .env and docker-compose.yml, comparable with git repo: /srv/misp-containers.
* Please note that docker images may change once released; if you want to persist, stick to commit tags in .env.
- All Docker data is located under: /srv/misp-volumes.
- Test approach for cert replacement.
1.3 ToDo
- Document upgrade path.
1.4 Enforce SELinux
dnf -y install setroubleshoot-server sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config grep ^SELINUX= /etc/selinux/config SELINUX=enforcing setenforce 1 getenforce
1.5 Firewall Setup
dnf -y install firewalld systemctl is-enabled firewalld systemctl restart firewalld firewall-cmd --add-service https --permanent systemctl restart firewalld
1.6 Podman Setup
dnf -y install epel-release dnf -y install podman-compose podman skopeo sed -i.bak 's/^unqualified-search-registries .*/unqualified-search-registries = ["docker.io"]/' /etc/containers/registries.conf systemctl enable podman systemctl restart podman
1.6.1 Podman default network configuration
# create custom config
echo '# custom podman default networking
[network]
default_network = "podman"
default_subnet = "192.168.223.0/24"
default_subnet_pools = [{"base" = "192.168.224.0/20", "size" = 24}]
' >> /etc/containers/containers.conf
restorecon -FRv /etc/containers/containers.conf
systemctl restart podman
systemctl status podman
1.6.1.1 Podman default network configuration testing (optional)
mkdir /srv/compose-test
echo '
version: "3.8"
services:
busybox:
image: busybox
command: sleep 3600
' > /srv/compose-test/docker-compose.yml
cd /srv/compose-test
podman-compose up
podman network ls
podman network inspect podman
podman network inspect compose-test_default
1.7 Start the fresh misp configuration
cd /srv
genpasswd() {
local l=$1
[ "$l" == "" ] && l=40
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
mkdir /srv/git /srv/misp-containers /srv/misp-volumes
cd /srv/git
git clone https://github.com/MISP/misp-docker.git
cd /srv/git/misp-docker
# check latest version
grep _TAG= template.env
CORE_TAG=v2.4.195
MODULES_TAG=v2.4.195
cp -av docker-compose.yml /srv/misp-containers
cp -av template.env /srv/misp-containers/.env
cd /srv/misp-containers
# replace latest with tags, due we dont want to compile "this is a bug in compose file"
sed -i 's/misp-core:latest/misp-core:${CORE_TAG}/' docker-compose.yml
sed -i 's/misp-modules:latest/misp-modules:${MODULES_TAG}/' docker-compose.yml
# Corporate specific config
ADMIN_ORG="MyOrg"
SMARTHOST_ADDRESS="mailgw.domain.tld"
SMARTHOST_PORT=25
MISP_EMAIL="sender@domain.tld"
MISP_CONTACT="contact@domain.tld"
DISABLE_IPV6=true
BASE_URL="https://misp-test.domain.tld"
sed -i "s|^ADMIN_ORG=.*|ADMIN_ORG=\"$ADMIN_ORG\"|" .env
sed -i "s|^SMARTHOST_ADDRESS=.*|SMARTHOST_ADDRESS=\"$SMARTHOST_ADDRESS\"|" .env
sed -i "s|^SMARTHOST_PORT=.*|SMARTHOST_PORT=$SMARTHOST_PORT|" .env
sed -i "s|^# MISP_EMAIL=.*|MISP_EMAIL=\"$MISP_EMAIL\"|" .env
sed -i "s|^# MISP_CONTACT=.*|MISP_CONTACT=\"$MISP_CONTACT\"|" .env
sed -i "s|^# DISABLE_IPV6=.*|DISABLE_IPV6=$DISABLE_IPV6|" .env
sed -i "s|^BASE_URL=.*|BASE_URL=\"$BASE_URL\"|" .env
# random passwords
MYSQL_ROOT_PASSWORD=$(genpasswd)
MYSQL_PASSWORD=$(genpasswd)
REDIS_PASSWORD=$(genpasswd)
ENCRYPTION_KEY=$(genpasswd)
sed -i "s/# MYSQL_ROOT_PASSWORD=.*/MYSQL_ROOT_PASSWORD=\"$MYSQL_ROOT_PASSWORD\"/" .env
sed -i "s/# MYSQL_PASSWORD=.*/MYSQL_PASSWORD=\"$MYSQL_PASSWORD\"/" .env
sed -i "s/# REDIS_PASSWORD=.*/REDIS_PASSWORD=\"$REDIS_PASSWORD\"/" .env
sed -i "s/ENCRYPTION_KEY=.*/ENCRYPTION_KEY=\"$ENCRYPTION_KEY\"/" .env
1.7.1 Pull Docker images
cd /srv/misp-containers podman-compose pull
1.7.2 Insert CAP_AUDIT_WRITE to misp-core pod in docker compose file
# insert cap_add-CAP_AUDIT_WRITE
cd /srv/misp-containers
awk '
/misp-core:/ {print; in_misp_core=1; next}
/^[[:space:]]*[^[:space:]]/ && in_misp_core {in_misp_core=0; if (!cap_found) {print " cap_add:"; print " - CAP_AUDIT_WRITE"}}
{print}
' docker-compose.yml > temp.yml && mv -fv temp.yml docker-compose.yml
1.7.3 Update volumes in docker compose file and remove port 80
cd /srv/misp-containers
# change misp-core volume settings
sed -i 's|.*\/var/www/MISP/app/Config.*| - configs:/var/www/MISP/app/Config|' docker-compose.yml
sed -i 's|.*\/var/www/MISP/app/tmp/logs.*| - logs:/var/www/MISP/app/tmp/logs|' docker-compose.yml
sed -i 's|.*\/var/www/MISP/app/files.*| - files:/var/www/MISP/app/files|' docker-compose.yml
sed -i 's|.*\/etc/nginx/certs.*| - ssl:/etc/nginx/certs|' docker-compose.yml
sed -i 's|.*\/var/www/MISP/.gnupg.*| - gnupg:/var/www/MISP/.gnupg|' docker-compose.yml
# inject redis volume
awk '
/^ redis:/ {print; in_redis=1; next} # Match exactly " redis:"
/^[[:space:]]*[^[:space:]]/ && in_redis {in_redis=0; if (!volumes_found) {print " volumes:"; print " - redis_data:/data"}}
{print}
' docker-compose.yml > temp.yml && mv -fv temp.yml docker-compose.yml
# add missing volumes at the end
echo ' configs:
files:
gnupg:
logs:
ssl:
redis_data:
' >> docker-compose.yml
# remove port 80
sed -i '/80:80/d' docker-compose.yml
# add selinux volume tags
sed -i '/^[[:space:]]*#/!s|\(^[[:space:]]*-[[:space:]]*[^[:space:]]*:/[^[:space:]]*\)$|\1:Z|' docker-compose.yml
# verify changes
vimdiff docker-compose.yml ../git/misp-docker/docker-compose.yml
1.7.4 Create volumes for pods
cd /srv/misp-volumes for vol in misp-containers_mysql_data misp-containers_configs misp-containers_files misp-containers_gnupg misp-containers_logs misp-containers_ssl misp-containers_redis_data do echo "------ $vol" mkdir $vol podman volume create --opt type=none --opt o=bind --opt device=/srv/misp-volumes/$vol $vol done
1.8 Start compose and wait for finishing message
cd /srv/misp-containers/ # first start and follow logs podman-compose up -d podman logs -f misp-containers_misp-core_1 podman-compose down podman network inspect misp-containers_default
1.9 Now make a service out of it
echo '[Unit] Description=Docker Compose: MISP [Service] Type=oneshot WorkingDirectory=/srv/misp-containers ExecStart=/usr/bin/podman-compose up -d ExecStop=/usr/bin/podman-compose down RemainAfterExit=yes [Install] WantedBy=multi-user.target' > /etc/systemd/system/docker-misp.service restorecon -FRv /etc/systemd/system systemctl daemon-reload systemctl start docker-misp systemctl enable docker-misp systemctl status docker-misp podman logs -f misp-containers_misp-core_1
1.10 TEST
* admin@admin.test / admin
1.11 Custom Server Cert (just for Testing)
# Read Documentation in Readme first, there you find all cd /usr/local/sbin curl https://raw.githubusercontent.com/joe-speedboat/linux.scripts/master/shell/cert-create-ca.sh > cert-create-ca.sh chmod 700 cert-create-ca.sh cert-create-ca.sh $(hostname -f) # replace with your test fqdn systemctl stop docker-misp # [root@test-misp01 sbin]# ll /srv/misp-volumes/misp-containers_ssl/ # total 12 #-rw-r--r--. 1 root root 1805 Jun 26 13:51 cert.pem #-rw-r--r--. 1 root root 424 Jun 26 13:52 dhparams.pem #-rw-------. 1 root root 3272 Jun 26 13:51 key.pem #[root@test-misp01 sbin]# find /root/MySsl #/root/MySsl #/root/MySsl/test-misp01.domain.tld #/root/MySsl/test-misp01.domain.tld/servers #/root/MySsl/test-misp01.domain.tld/servers/test-misp01.domain.tld_cert.pem #/root/MySsl/test-misp01.domain.tld/servers/test-misp01.domain.tld_privkey.pem #/root/MySsl/test-misp01.domain.tld/servers/test-misp01.domain.tld_ca_chain.pem #/root/MySsl/test-misp01.domain.tld/tmp #/root/MySsl/test-misp01.domain.tld/tmp/test-misp01.domain.tld.csr.pem #/root/MySsl/ca #/root/MySsl/ca/root.crt.pem #/root/MySsl/ca/root.key.pem #/root/MySsl/ca/root.crt.srl cat /root/MySsl/test-misp01.domain.tld/servers/test-misp01.domain.tld_cert.pem > /srv/misp-volumes/misp-containers_ssl/cert.pem cat /root/MySsl/test-misp01.domain.tld/servers/test-misp01.domain.tld_privkey.pem > /srv/misp-volumes/misp-containers_ssl/key.pem cat /root/MySsl/ca/root.crt.pem > /srv/misp-volumes/misp-containers_ssl/ca.pem systemctl start docker-misp