diff --git a/.github/workflows/generate-image.yml b/.github/workflows/generate-image.yml new file mode 100644 index 00000000..bdc325ad --- /dev/null +++ b/.github/workflows/generate-image.yml @@ -0,0 +1,48 @@ +# +name: Create and publish a Docker image + +# Configures this workflow to run every time a change is pushed to the branch called `release`. +on: + workflow_dispatch: + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{secrets.DOCKERHUB_USERNAME}}/vulndb + + - name: Build&Push Basic Image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{secrets.DOCKERHUB_USERNAME}}/vulndb:basic + labels: ${{ steps.meta.outputs.labels }} + file: Dockerfile-basic + + + - name: Update FROM in update Docker file + run: sed -i 's|FROM vulndb:latest|FROM ${{secrets.DOCKERHUB_USERNAME}}/vulndb:basic|' Dockerfile-update + + + - name: Build&Push Image with updated data + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{secrets.DOCKERHUB_USERNAME}}/vulndb:latest + labels: ${{ steps.meta.outputs.labels }} + file: Dockerfile-update diff --git a/.github/workflows/update-image.yml b/.github/workflows/update-image.yml new file mode 100644 index 00000000..800b87d3 --- /dev/null +++ b/.github/workflows/update-image.yml @@ -0,0 +1,39 @@ +# +name: Update and publish vunldb Docker image + +# Configures this workflow to run every time a change is pushed to the branch called `release`. +on: + workflow_dispatch: + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{secrets.DOCKERHUB_USERNAME}}/vulndb + + - name: Update FROM in update Docker file + run: sed -i 's|FROM vulndb:latest|FROM ${{secrets.DOCKERHUB_USERNAME}}/vulndb:latest|' Dockerfile-update + + + - name: Build&Push Image with updated data + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{secrets.DOCKERHUB_USERNAME}}/vulndb:latest + labels: ${{ steps.meta.outputs.labels }} + file: Dockerfile-update diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..10a7a437 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM python:3.10 +ARG PACKAGE +COPY db/create.sql /docker-entrypoint-initdb.d/. +RUN apt-get clean && apt-get update && apt-get install -y postgresql postgresql-contrib +RUN apt-get install -y gcc +ENV DB_USER=default_user +ENV DB_PASSWORD=default_password +ENV DB_NAME=default_db +USER postgres +RUN /etc/init.d/postgresql start && \ + psql --command "CREATE USER ${DB_USER} WITH SUPERUSER PASSWORD '${DB_PASSWORD}';" +USER root +RUN pip install pip +RUN pip install psycopg2 +WORKDIR /app +COPY . /app +COPY config.toml /app/src/bomsquad/vulndb/config.toml +COPY ${PACKAGE} /app +COPY pg_hba.conf /etc/postgresql/15/main/pg_hba.conf +RUN pip install -e . +USER postgres +RUN /etc/init.d/postgresql start && psql < /app/db/create.sql +RUN /etc/init.d/postgresql start && vulndb nvd ingest --scope cve +RUN /etc/init.d/postgresql start && vulndb osv ingest +EXPOSE 5000 +ENTRYPOINT [ "/app/vulndb.sh" ] + + diff --git a/Dockerfile-basic b/Dockerfile-basic new file mode 100644 index 00000000..820e21ba --- /dev/null +++ b/Dockerfile-basic @@ -0,0 +1,24 @@ +FROM python:3.10 +ARG PACKAGE +COPY db/create.sql /docker-entrypoint-initdb.d/. +RUN apt-get update && apt-get install -y postgresql postgresql-contrib +RUN apt-get install -y gcc +ENV DB_USER=default_user +ENV DB_PASSWORD=default_password +ENV DB_NAME=default_db +USER postgres +RUN /etc/init.d/postgresql start && \ + psql --command "CREATE USER ${DB_USER} WITH SUPERUSER PASSWORD '${DB_PASSWORD}';" +USER root +RUN pip install pip +RUN pip install psycopg2 +WORKDIR /app +COPY . /app +COPY config.toml /app/src/bomsquad/vulndb/config.toml +COPY ${PACKAGE} /app +COPY pg_hba.conf /etc/postgresql/15/main/pg_hba.conf +RUN pip install -e . +USER postgres +RUN /etc/init.d/postgresql start && psql < /app/db/create.sql +EXPOSE 5000 +ENTRYPOINT [ "/app/vulndb.sh" ] \ No newline at end of file diff --git a/Dockerfile-update b/Dockerfile-update new file mode 100644 index 00000000..0d9e1a16 --- /dev/null +++ b/Dockerfile-update @@ -0,0 +1,5 @@ +FROM vulndb:latest +RUN /etc/init.d/postgresql start && vulndb nvd ingest --scope cve --update +RUN /etc/init.d/postgresql start && vulndb osv ingest +EXPOSE 5000 +ENTRYPOINT [ "/app/vulndb.sh" ] diff --git a/Dockerfile-update-nvd b/Dockerfile-update-nvd new file mode 100644 index 00000000..25384448 --- /dev/null +++ b/Dockerfile-update-nvd @@ -0,0 +1,5 @@ +FROM vulndb:basic +RUN /etc/init.d/postgresql start && vulndb nvd ingest --scope cve --update +#RUN /etc/init.d/postgresql start && vulndb osv ingest +EXPOSE 5000 +ENTRYPOINT [ "/app/vulndb.sh" ] \ No newline at end of file diff --git a/Dockerfile-update-nvd2osv b/Dockerfile-update-nvd2osv new file mode 100644 index 00000000..6ec1b4ff --- /dev/null +++ b/Dockerfile-update-nvd2osv @@ -0,0 +1,4 @@ +FROM vulndb:nvd +RUN /etc/init.d/postgresql start && vulndb osv ingest +EXPOSE 5000 +ENTRYPOINT [ "/app/vulndb.sh" ] \ No newline at end of file diff --git a/build-all.sh b/build-all.sh new file mode 100644 index 00000000..71eeb889 --- /dev/null +++ b/build-all.sh @@ -0,0 +1,4 @@ +docker build -t vulndb:basic -f Dockerfile-basic . +docker build -t vulndb:nvd -f Dockerfile-update-nvd . +docker build -t vulndb:nvd-osv -f Dockerfile-update-nvd2osv . +docker tag vulndb:nvd-osv vulndb diff --git a/config.toml b/config.toml index 3c5c099c..fec7e2c3 100644 --- a/config.toml +++ b/config.toml @@ -1,8 +1,11 @@ [vulndb] -database = 'vulndb' +database='vulndb' min_conn = 1 max_conn = 10 +username='default_user' +password='default_password' # username = 'your-username' # password = 'your-password' # nvd_api_key = 'your-api-key' request_delay = 5 +gcloud_project = 'devstartup' diff --git a/db/create.sql b/db/create.sql index f1b81d13..6a3586c6 100644 --- a/db/create.sql +++ b/db/create.sql @@ -1,5 +1,7 @@ CREATE DATABASE vulndb; +\c vulndb; + CREATE TABLE cve( id serial NOT NULL PRIMARY KEY, data jsonb NOT NULL @@ -22,3 +24,7 @@ CREATE TABLE osv( CREATE INDEX osv_id ON osv USING gin((data->'id')); CREATE INDEX osv_alias_id ON osv USING gin((data->'aliases')); + +GRANT CONNECT ON DATABASE vulndb TO default_user; +GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO default_user; +GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO default_user; diff --git a/pg_hba.conf b/pg_hba.conf new file mode 100644 index 00000000..d4679b6f --- /dev/null +++ b/pg_hba.conf @@ -0,0 +1,105 @@ +# PostgreSQL Client Authentication Configuration File +# =================================================== +# +# Refer to the "Client Authentication" section in the PostgreSQL +# documentation for a complete description of this file. A short +# synopsis follows. +# +# This file controls: which hosts are allowed to connect, how clients +# are authenticated, which PostgreSQL user names they can use, which +# databases they can access. Records take one of these forms: +# +# local DATABASE USER METHOD [OPTIONS] +# host DATABASE USER ADDRESS METHOD [OPTIONS] +# hostssl DATABASE USER ADDRESS METHOD [OPTIONS] +# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] +# hostgssenc DATABASE USER ADDRESS METHOD [OPTIONS] +# hostnogssenc DATABASE USER ADDRESS METHOD [OPTIONS] +# +# (The uppercase items must be replaced by actual values.) +# +# The first field is the connection type: +# - "local" is a Unix-domain socket +# - "host" is a TCP/IP socket (encrypted or not) +# - "hostssl" is a TCP/IP socket that is SSL-encrypted +# - "hostnossl" is a TCP/IP socket that is not SSL-encrypted +# - "hostgssenc" is a TCP/IP socket that is GSSAPI-encrypted +# - "hostnogssenc" is a TCP/IP socket that is not GSSAPI-encrypted +# +# DATABASE can be "all", "sameuser", "samerole", "replication", a +# database name, or a comma-separated list thereof. The "all" +# keyword does not match "replication". Access to replication +# must be enabled in a separate record (see example below). +# +# USER can be "all", a user name, a group name prefixed with "+", or a +# comma-separated list thereof. In both the DATABASE and USER fields +# you can also write a file name prefixed with "@" to include names +# from a separate file. +# +# ADDRESS specifies the set of hosts the record matches. It can be a +# host name, or it is made up of an IP address and a CIDR mask that is +# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that +# specifies the number of significant bits in the mask. A host name +# that starts with a dot (.) matches a suffix of the actual host name. +# Alternatively, you can write an IP address and netmask in separate +# columns to specify the set of hosts. Instead of a CIDR-address, you +# can write "samehost" to match any of the server's own IP addresses, +# or "samenet" to match any address in any subnet that the server is +# directly connected to. +# +# METHOD can be "trust", "reject", "md5", "password", "scram-sha-256", +# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert". +# Note that "password" sends passwords in clear text; "md5" or +# "scram-sha-256" are preferred since they send encrypted passwords. +# +# OPTIONS are a set of options for the authentication in the format +# NAME=VALUE. The available options depend on the different +# authentication methods -- refer to the "Client Authentication" +# section in the documentation for a list of which options are +# available for which authentication methods. +# +# Database and user names containing spaces, commas, quotes and other +# special characters must be quoted. Quoting one of the keywords +# "all", "sameuser", "samerole" or "replication" makes the name lose +# its special character, and just match a database or username with +# that name. +# +# This file is read on server startup and when the server receives a +# SIGHUP signal. If you edit the file on a running system, you have to +# SIGHUP the server for the changes to take effect, run "pg_ctl reload", +# or execute "SELECT pg_reload_conf()". +# +# Put your actual configuration here +# ---------------------------------- +# +# If you want to allow non-local connections, you need to add more +# "host" records. In that case you will also need to make PostgreSQL +# listen on a non-local interface via the listen_addresses +# configuration parameter, or via the -i or -h command line switches. + + + + +# DO NOT DISABLE! +# If you change this first entry you will need to make sure that the +# database superuser can access the database using some other method. +# Noninteractive access to all databases is required during automatic +# maintenance (custom daily cronjobs, replication, and similar tasks). +# +# Database administrative login by Unix domain socket +local all postgres peer + +# TYPE DATABASE USER ADDRESS METHOD + +# "local" is for Unix domain socket connections only +local all all trust +# IPv4 local connections: +host all all 127.0.0.1/32 scram-sha-256 +# IPv6 local connections: +host all all ::1/128 scram-sha-256 +# Allow replication connections from localhost, by a user with the +# replication privilege. +local replication all peer +host replication all 127.0.0.1/32 scram-sha-256 +host replication all ::1/128 scram-sha-256 + diff --git a/pyproject.toml b/pyproject.toml index 837b1cdd..bf051346 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ datamodel-code-generator = ">=0.21.0" rich = "^13.4.2" univers = "^30.10.0" cpe = "^1.2.1" +requests = "^2.30.0" [build-system] diff --git a/vulndb.sh b/vulndb.sh new file mode 100755 index 00000000..28d541b6 --- /dev/null +++ b/vulndb.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# This script forwards all arguments to the vulndb command + +# Forwarding arguments +/etc/init.d/postgresql start +vulndb "$@"