From f163445ecf565f62944f06b0189ee22fe402d677 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 18 Jan 2022 01:27:08 +0200 Subject: [PATCH] feat(clamav): add clamav (#1725) * feat(clamav): add clamav * typo and update defaults * update questions * use this for test * no quotes * readrootfs * varrun * rofs * try this user * without varrun * readonly * var * root * probe * disable probe * false runasnonroot * test probes * doc ports * sync questions * update image --- charts/incubator/clamav/Chart.yaml | 29 ++ charts/incubator/clamav/questions.yaml | 418 ++++++++++++++++++ charts/incubator/clamav/templates/common.yaml | 1 + charts/incubator/clamav/values.yaml | 75 ++++ docs/_static/img/appicons/clamav-icon.png | Bin 0 -> 25476 bytes docs/manual/default-ports.md | 169 +++---- 6 files changed, 609 insertions(+), 83 deletions(-) create mode 100644 charts/incubator/clamav/Chart.yaml create mode 100644 charts/incubator/clamav/questions.yaml create mode 100644 charts/incubator/clamav/templates/common.yaml create mode 100644 charts/incubator/clamav/values.yaml create mode 100644 docs/_static/img/appicons/clamav-icon.png diff --git a/charts/incubator/clamav/Chart.yaml b/charts/incubator/clamav/Chart.yaml new file mode 100644 index 00000000000..e013976f580 --- /dev/null +++ b/charts/incubator/clamav/Chart.yaml @@ -0,0 +1,29 @@ +apiVersion: v2 +appVersion: "0.104.2" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.13.0 +description: ClamAV® is an open source antivirus engine for detecting trojans, viruses, malware & other malicious threats. +home: https://github.com/truecharts/apps/tree/master/charts/stable/clamav +icon: https://truecharts.org/_static/img/appicons/clamav-icon.png +keywords: +- clamav +- antivirus +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: clamav +sources: +- https://github.com/Cisco-Talos/clamav +- https://hub.docker.com/r/clamav/clamav +- https://docs.clamav.net/ +type: application +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - utilities + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/clamav/questions.yaml b/charts/incubator/clamav/questions.yaml new file mode 100644 index 00000000000..a3780984b90 --- /dev/null +++ b/charts/incubator/clamav/questions.yaml @@ -0,0 +1,418 @@ +# Include{groups} +portals: {} + +questions: + +# Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + type: dict + attrs: +# Include{fixedEnv} + - variable: CLAMAV_NO_CLAMD + label: "NO CLAMD" + description: "Do not start clamd." + schema: + type: boolean + default: false + - variable: CLAMAV_NO_FRESHCLAMD + label: "NO FRESHCLAMD" + description: "Do not start the freshclam daemon." + schema: + type: boolean + default: false + - variable: CLAMAV_NO_MILTERD + label: "NO MILTERD" + description: "Do not start the clamav-milter daemon." + schema: + type: boolean + default: true + - variable: CLAMD_STARTUP_TIMEOUT + label: "STARTUP TIMEOUT" + description: "Seconds to wait for clamd to start." + schema: + type: int + default: 1800 + - variable: FRESHCLAM_CHECKS + label: "FRESHCLAM CHECKS " + description: "Freshclam daily update frequency." + schema: + type: int + default: 1 + +# Include{containerConfig} + + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 3310 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: enabled + label: "Enable the port" + schema: + type: boolean + default: true + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 3310 + - variable: milter + label: "Milter Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + type: dict + attrs: +# Include{serviceSelector} + - variable: milter + label: "Main Service Port Configuration" + schema: + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 7357 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: enabled + label: "Enable the port" + schema: + type: boolean + default: true + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 7357 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + type: dict + attrs: + - variable: sigdatabase + label: "App Signature Database Storage" + description: "Stores the Application Signature Database." + schema: + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} + - variable: scandir + label: "App Scan Dir Storage" + description: "Stores the Application Scan Directory." + schema: + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} + +# Include{persistenceList} + + - variable: ingress + label: "" + group: "Ingress" + schema: + type: dict + attrs: + - variable: main + label: "Main Ingress" + schema: + type: dict + attrs: +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + +# Include{ingressList} + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: false +# Include{securityContextAdvanced} + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 0 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/clamav/templates/common.yaml b/charts/incubator/clamav/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/clamav/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/clamav/values.yaml b/charts/incubator/clamav/values.yaml new file mode 100644 index 00000000000..9449ab9bc53 --- /dev/null +++ b/charts/incubator/clamav/values.yaml @@ -0,0 +1,75 @@ +image: + repository: tccr.io/truecharts/clamav + pullPolicy: IfNotPresent + tag: v0.104.2@sha256:9b600aac57738b292236fc534220b317ee3185fc96d0a995e08f44b19c4dcb25 + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +probes: + liveness: + enabled: true + custom: true + spec: + exec: + command: + - clamdcheck.sh + initialDelaySeconds: 15 + periodSeconds: 30 + failureThreshold: 10 + timeoutSeconds: 1 + readiness: + enabled: true + custom: true + spec: + exec: + command: + - clamdcheck.sh + initialDelaySeconds: 15 + periodSeconds: 30 + failureThreshold: 10 + timeoutSeconds: 1 + startup: + enabled: true + custom: true + spec: + exec: + command: + - clamdcheck.sh + initialDelaySeconds: 15 + periodSeconds: 30 + failureThreshold: 10 + timeoutSeconds: 1 + +service: + main: + ports: + main: + port: 3310 + targetPort: 3310 + milter: + ports: + milter: + port: 7357 + targetPort: 7357 + +env: + CLAMAV_NO_CLAMD: false + CLAMAV_NO_FRESHCLAMD: false + CLAMAV_NO_MILTERD: true + CLAMD_STARTUP_TIMEOUT: 1800 + FRESHCLAM_CHECKS: 1 + +persistence: + sigdatabase: + enabled: true + mountPath: "/var/lib/clamav" + scandir: + enabled: true + mountPath: "/scandir" + readOnly: true diff --git a/docs/_static/img/appicons/clamav-icon.png b/docs/_static/img/appicons/clamav-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0db2d4ac217487fec92b1add7729269e1eee85 GIT binary patch literal 25476 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 PIewy{s;vT7vIzYjPI9lD literal 0 HcmV?d00001 diff --git a/docs/manual/default-ports.md b/docs/manual/default-ports.md index 56d44564d1d..cf6c9722b00 100644 --- a/docs/manual/default-ports.md +++ b/docs/manual/default-ports.md @@ -62,6 +62,7 @@ These defaults can of course be changed, but as we guarantee "sane, working defa | loki | main | main | 3100 | HTTP | | | jdownloader2 | myjd | myjd | 3129 | TCP | | | pylon | main | main | 3131 | TCP | | +| clamav | main | main | 3310 | TCP | | | unifi | stun | mstunain | 3478 | UDP | | | logitech-media-server | playertcp | slimprototcp | 3483 | TCP | | | logitech-media-server | playerudp | slimprotoudp | 3483 | UDP | | @@ -93,6 +94,7 @@ These defaults can of course be changed, but as we guarantee "sane, working defa | qbittorrent | torrentudp | torrentudp | 6881 | UDP | | | aria2 | listen | listen | 6888 | TCP | | | logitech-media-server | main | main | 7000 | TCP | | +| clamav | milter | milter | 7357 | TCP | | | foldingathome | main | main | 7396 | TCP | | | haste-server | main | main | 7777 | TCP | | | nextcloud | hpb | hpb | 7867 | TCP | | @@ -145,7 +147,7 @@ These defaults can of course be changed, but as we guarantee "sane, working defa | tvheadend | main | main | 9981 | TCP | | | tvheadend | htsp | htsp | 9982 | TCP | | | teamspeak3 | voice | voice | 9987 | UDP | | -| guacamole-client | main | main | 9998 | TCP | | +| guacamole-client | main | main | 9998 | TCP | | | stash | main | main | 9999 | TCP | | | ser2sock | main | main | 10000 | TCP | | | deconz | websocket | websocket | 10001 | TCP | | @@ -367,88 +369,89 @@ These defaults can of course be changed, but as we guarantee "sane, working defa ## Ports that are blocked in major web browsers -| Port | Used by (example) | -| :---: | :---: | -| 1 | tcpmux | -| 7 | echo | -| 9 | discard | -| 11 | systat | -| 13 | daytime | -| 15 | netstat | -| 17 | qotd | -| 19 | chargen | -| 20 | ftp data | -| 21 | ftp access | -| 22 | ssh | -| 23 | telnet | -| 25 | smtp | -| 37 | time | -| 42 | name | -| 43 | nicname | -| 53 | domain | -| 69 | tftp | -| 77 | priv-rjs | -| 79 | finger | -| 87 | ttylink | -| 95 | supdup | -| 101 | hostriame | -| 102 | iso-tsap | -| 103 | gppitnp | -| 104 | acr-nema | -| 109 | pop2 | -| 110 | pop3 | -| 111 | sunrpc | -| 113 | auth | -| 115 | sftp | -| 117 | uucp-path | -| 119 | nntp | -| 123 | NTP | -| 135 | loc-srv /epmap | -| 137 | netbios | -| 139 | netbios | -| 143 | imap2 | -| 161 | snmp | -| 179 | BGP | -| 389 | ldap | -| 427 | SLP (Also used by Apple Filing Protocol) | -| 465 | smtp+ssl | -| 512 | print / exec | -| 513 | login | -| 514 | shell | -| 515 | printer | -| 526 | tempo | -| 530 | courier | -| 531 | chat | -| 532 | netnews | -| 540 | uucp | -| 548 | AFP (Apple Filing Protocol) | -| 554 | rtsp | -| 556 | remotefs | -| 563 | nntp+ssl | -| 587 | smtp (rfc6409) | -| 601 | syslog-conn (rfc3195) | -| 636 | ldap+ssl | -| 989 | ftps-data | -| 990 | ftps | -| 993 | ldap+ssl | -| 995 | pop3+ssl | -| 1719 | h323gatestat | -| 1720 | h323hostcall | -| 1723 | pptp | -| 2049 | nfs | -| 3659 | apple-sasl / PasswordServer | -| 4045 | lockd | -| 5060 | sip | -| 5061 | sips | -| 6000 | X11 | -| 6566 | sane-port | -| 6665 | Alternate IRC [Apple addition] | -| 6666 | Alternate IRC [Apple addition] | -| 6667 | Standard IRC [Apple addition] | -| 6668 | Alternate IRC [Apple addition] | -| 6669 | Alternate IRC [Apple addition] | -| 6697 | IRC + TLS | -| 10080 | Amanda | +| Port | Used by (example) | +| :---: | :--------------------------------------: | +| 1 | tcpmux | +| 7 | echo | +| 9 | discard | +| 11 | systat | +| 13 | daytime | +| 15 | netstat | +| 17 | qotd | +| 19 | chargen | +| 20 | ftp data | +| 21 | ftp access | +| 22 | ssh | +| 23 | telnet | +| 25 | smtp | +| 37 | time | +| 42 | name | +| 43 | nicname | +| 53 | domain | +| 69 | tftp | +| 77 | priv-rjs | +| 79 | finger | +| 87 | ttylink | +| 95 | supdup | +| 101 | hostriame | +| 102 | iso-tsap | +| 103 | gppitnp | +| 104 | acr-nema | +| 109 | pop2 | +| 110 | pop3 | +| 111 | sunrpc | +| 113 | auth | +| 115 | sftp | +| 117 | uucp-path | +| 119 | nntp | +| 123 | NTP | +| 135 | loc-srv /epmap | +| 137 | netbios | +| 139 | netbios | +| 143 | imap2 | +| 161 | snmp | +| 179 | BGP | +| 389 | ldap | +| 427 | SLP (Also used by Apple Filing Protocol) | +| 465 | smtp+ssl | +| 512 | print / exec | +| 513 | login | +| 514 | shell | +| 515 | printer | +| 526 | tempo | +| 530 | courier | +| 531 | chat | +| 532 | netnews | +| 540 | uucp | +| 548 | AFP (Apple Filing Protocol) | +| 554 | rtsp | +| 556 | remotefs | +| 563 | nntp+ssl | +| 587 | smtp (rfc6409) | +| 601 | syslog-conn (rfc3195) | +| 636 | ldap+ssl | +| 989 | ftps-data | +| 990 | ftps | +| 993 | ldap+ssl | +| 995 | pop3+ssl | +| 1719 | h323gatestat | +| 1720 | h323hostcall | +| 1723 | pptp | +| 2049 | nfs | +| 3659 | apple-sasl / PasswordServer | +| 4045 | lockd | +| 5060 | sip | +| 5061 | sips | +| 6000 | X11 | +| 6566 | sane-port | +| 6665 | Alternate IRC [Apple addition] | +| 6666 | Alternate IRC [Apple addition] | +| 6667 | Standard IRC [Apple addition] | +| 6668 | Alternate IRC [Apple addition] | +| 6669 | Alternate IRC [Apple addition] | +| 6697 | IRC + TLS | +| 10080 | Amanda | + ##### Note: TCP and UDP ports that are the same in some Apps, are not by mistake. ##### If you notice a port conflict, please notify us so we can resolve it (when possible).