2.7 KiB
Migrating existing superuser to a less privileged user
Mattermost-docker used to use the initially created user while database initialization. This is being accomplished by using the
POSTGRES_USER
environment variable of the PostgreSQL Docker image. While this is convinient because it requires less setup steps
it's best practice and desirable to us a less privileged user to connect to the database. The following steps should be safe and
executable while Mattermost is running.
NOTE: Commands with a $ prefix denote those are executed as user, # as root and commands without a prefix are database commands. We assume the database name is mattermost and the database user mmuser.
1. Find out the name or id of the PostgreSQL container
To get either the name or the id of the running PostgeSQL container we can use $ sudo docker ps
.
2. Attaching to the database container
$ sudo docker exec -it POSTGRES_CONTAINER_NAME/ID /bin/sh
3. Connecting to the database
# psql DATABASE_NAME USERNAME
e.g.
# psql mattermost mmuser
4. Checking if the Mattermost user is a superuser
The following PostgreSQL command will print a list of the present users and its attributes.
\du
A possible output can look like the following:
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
mmuser | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
5. Creating a new superuser
and changing existing role attributes
ATTENTION: It's strongly recommended to create a database prior alteration. This can be done by stopping the database
and backup the PostgreSQL data path at filesystem level and/or to use pg_dumpall
. For this attach to the running PostgreSQL
container described in step 2 and execute:
pg_dump -U mmuser -d mattermost > /var/lib/postgresql/data/BACKUP_MATTERMOST.sql
This dumps your mattermost database to the mounted directory, specified in the docker-compose.yml file.
After your backup is done you can connect to the database (see step 3) and execute the following SQL queries:
CREATE ROLE superuser WITH BYPASSRLS REPLICATION CREATEDB CREATEROLE SUPERUSER LOGIN PASSWORD 'superuser_passwd';
ALTER DATABASE mattermost OWNER TO superuser;
ALTER DATABASE postgres OWNER TO superuser;
ALTER DATABASE template0 OWNER TO superuser;
ALTER DATABASE template1 OWNER TO superuser;
GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;
ALTER ROLE mmuser NOBYPASSRLS NOREPLICATION NOCREATEDB NOCREATEROLE NOSUPERUSER;
Even though you can apply the changes in a non-downtime it's required to restart the containers.