moravianlibrary / MEditor

Digitization information system build on top of Fedora repository
GNU General Public License v2.0
15 stars 7 forks source link

postgres je defaultně otevřená do světa se znamými přístupovými údaji #112

Open rzeh4n opened 7 years ago

rzeh4n commented 7 years ago

Když podle https://github.com/moravianlibrary/MEditor/wiki/Instalace rozjedu přes docker compose 4 dockerové kontejnery, tak jeden z nich (postgres:9.6) umožňuje na veřejné ip a portu 5432 přístup do databáze, přičemž defaultní název databáze, login i heslo je dohledatelné (všechno meditor).

psql -h editor.nekde.cz -p 5432 --username=meditor --password meditor

Zkusil jsem upravit docker-compose.yml doplněním command následovně:

meditorPostgres:
    #https://hub.docker.com/_/postgres/
    image: "postgres:9.6"
    command: postgres -c listen_addresses='localhost'
#    command: postgres -c listen_addresses='*'
    environment:
      - POSTGRES_USER=meditor
      - POSTGRES_PASSWORD=meditor
      - POSTGRES_DB=meditor
      - TERM=xterm
    ports:
      - "5432:5432"

To vypadá, že funguje a přebije se listen_addresses v postgresql.conf. Jenže editor přestane fungovat, přičemž v hlavním logu kontejneru není nic.

docker logs MEDITOR_CONTAINER_ID

Až teda v tomcat/logs/localhost.2017-06-13.log

13-Jun-2017 13:45:03.388 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class cz.mzk.editor.server.FlywayListener
 com.googlecode.flyway.core.api.FlywayException: Unable to obtain Jdbc connection from DataSource
        at com.googlecode.flyway.core.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56)
        at com.googlecode.flyway.core.Flyway.execute(Flyway.java:1156)
        at com.googlecode.flyway.core.Flyway.migrate(Flyway.java:815)
        at cz.mzk.editor.server.FlywayListener.contextInitialized(FlywayListener.java:32)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4745)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.postgresql.util.PSQLException: Connection to meditorPostgres:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:262)
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:52)
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)
        at org.postgresql.Driver.makeConnection(Driver.java:404)
        at org.postgresql.Driver.connect(Driver.java:272)
        at com.googlecode.flyway.core.util.jdbc.DriverDataSource.getConnectionFromDriver(DriverDataSource.java:193)
        at com.googlecode.flyway.core.util.jdbc.DriverDataSource.getConnection(DriverDataSource.java:161)
        at com.googlecode.flyway.core.util.jdbc.JdbcUtils.openConnection(JdbcUtils.java:50)
        ... 16 more
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.postgresql.core.PGStream.<init>(PGStream.java:61)
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
        ... 23 more

Takže nějspíš pro editor nestačí databáze dostupná jen na localhostu.

Možná by stačilo na wiki stránce k instalaci upozornit na tohle a doporučit změnu názvu databáze/loginu/hesla v docker-compose.yml a meditor.env a případně úpravu iptables.

leiblix commented 7 years ago

Takže nějspíš pro editor nestačí databáze dostupná jen na localhostu. To nestačí, každý ta service v docker-composu má vlastní IP.

Pokud chceš ten postgres zavřít, mělo by postačit upravit ports na:

   ports:
      - "5432"

Pak na to editor uvidí, ale zůstane to viditelné pouze z vnitřní sítě dockeru (neproroutuje se to ven). Pokud to bude fungovat, docker-compose upravím.

rzeh4n commented 7 years ago

Jo, tohle trochu pomůže, protože navenek už to nebude na portu 5432, ale nějakém náhodném. Ale pořád je ten port dostupný zvenku.

ports Expose ports. Either specify both ports (HOST:CONTAINER), or just the container port (a random host port will be chosen).

Takže namísto

0.0.0.0:5432->5432/tcp

bude v docker ps třeba

0.0.0.0:32837->5432/tcp

Ještě jsem zkusil direktivu ports úplně odstranit a ono to funguje i tak. Evidentně ports slouží k zvěřejnění portů ale v rámci docker-compose sítě to není potřeba dělat. V docker ps má tak kontejner v PORTS akorát tohle:

5432/tcp

I v téhle konfiguraci je editor napojený na databázi, sledoval jsem tabulku action a přibývaly tam záznamy, jak jsem otevíral věci.

Po každém pokusu jsem pro jistotu mazal všechno takhle:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker system prune
leiblix commented 7 years ago

Aha, to je protože v Dockerfilu Postgresu je zadefinována direktiva expose

https://github.com/docker-library/postgres/blob/54053ad27ac099abff3d4964bf7460fb9c541d5d/9.6/Dockerfile#L68

Potom se to vždy otevře, možná to jde v některé novější verzi docker-compose přepsat, ale nejsem si jistý.

Možná by stačilo na wiki stránce k instalaci upozornit na tohle a doporučit změnu názvu databáze/loginu/hesla v docker-compose.yml a meditor.env a případně úpravu iptables.

Toto bude nakonec asi nejjednodušší :-)

rzeh4n commented 7 years ago

A co teda odstranit ports z docker-compose.yml? Jakože

  meditorPostgres:
    #https://hub.docker.com/_/postgres/
    image: "postgres:9.6"
    environment:
      - POSTGRES_USER=meditor
      - POSTGRES_PASSWORD=meditor
      - POSTGRES_DB=meditor
      - TERM=xterm
networks:
  default:

Protože takhle je 5432 exposed ale jenom do vnitřní sítě pro docker-compose. Např.:

root@editor:~/s2i-meditor/example# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6aecbe015c3d        bridge              bridge              local
59e322631572        example_default     bridge              local
f428a856ba34        host                host                local
efc7c65d113c        none                null                local
root@editor:~/s2i-meditor/example# docker network inspect 59
[
    {
        "Name": "example_default",
        "Id": "59e3226315721568bc6b71c21369df06e686421700ebef354547a77747a5e9ee",
        "Created": "2017-06-14T11:12:51.759757231+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "2c202bf0c39be9389c23e4b4c79d0212ae44a381202b8f536fdc09217d9ad167": {
                "Name": "example_keycloakbackend_1",
                "EndpointID": "646c693883d1c39b75b26c74434768f31a2c3b40d63d2941a927c7e9ad8ffc37",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "984cc925b7bf68021934862c766e7e13d736c28357104152ea7f9c71601d5839": {
                "Name": "example_proxy_1",
                "EndpointID": "f42926f5720132378285e520cdab9d2ff20267dda6c29df0c0436222718bf026",
                "MacAddress": "02:42:ac:12:00:05",
                "IPv4Address": "172.18.0.5/16",
                "IPv6Address": ""
            },
            "e137740565f87d280c1915de265d74115c075651930fc32b85376c93a7497c17": {
                "Name": "example_meditorPostgres_1",
                "EndpointID": "d0ec086af82c92f009f223ddbc34655dca8d44b9cc296697b77f4a162ad90de9",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "fb6434e5ef25d443aec211dd3077cc11290d9cd1bb653f516d91586c840af524": {
                "Name": "example_meditor_1",
                "EndpointID": "1f8bc694a726b803d95e0d743061052e1539e9626dbe05414a480071e1a5b29b",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

root@editor:~/s2i-meditor/example# psql -h SERVER_PUBLIC_IP -p 5432 -U meditor --password meditor
Password for user meditor: 
psql: could not connect to server: Connection refused
    Is the server running on host "SERVER_PUBLIC_IP" and accepting
    TCP/IP connections on port 5432?
root@editor:~/s2i-meditor/example# psql -h 172.18.0.3 -p 5432 -U meditor --password meditor
Password for user meditor: 
psql (9.6.3)
Type "help" for help.

meditor=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 meditor   | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(4 rows)

meditor=# 

Takže tam může editor (vyzkoušeno) a obecně všechny kontejnery přes 172.18.0.3:5432, ale na veřejné IP neposlouchá na portu 5432 nic, takže se tam rozhodně nedostanu z venku (vyzkoušeno). Imho ideální stav.