通过Kong来做NPM私有库(verdaccio)的IP限制访问

通过Kong来做NPM私有库(verdaccio)的IP限制访问

十一月 21, 2019

最近公司自己的Npm私有库(verdaccio)需要做一些安全把控。于是就考虑在前面加一层开源网关kong,用来做IP白名单。
由于公司开端口太麻烦(原来就只开了80和4873),所以kong前面还用了Nginx做转发。具体就是远端访问->Nginx->Kong->Verdaccio,本想着很简单,可是一路也碰到了很多坑,特此记录下。 为什么不在nginx上直接做,因为每次开白名单还要去改nginx再重启太麻烦啦,直接在kong上面配配多舒坦。
关于kong和verdaccio的安装就不在这里多过阐述了,下面进入正题。

verdaccio配置转发

首先先看verdaccio的官网,如何配置转发:
Nginx配置

location / {
    proxy_pass http://127.0.0.1:4873/;
    proxy_set_header Host            $host:$server_port;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
}

这里有一个着重点,就是Host,我们来看官网说明:

If you run verdaccio behind reverse proxy, you may noticed all resource file served as relaticve path, like http://127.0.0.1:4873/-/static
To resolve this issue, you should send real domain and port to verdaccio with Host header  

实际上Host就是用来将相对路径前缀改掉。
既然知道怎么修改了,那么我们就来修改我们的kong配置,用同样的方式来进行转发就可以了。
首先创建一个service,指向verdaccio。
service配置
由于kong是在docker里面搭建的,所以host指向的是宿主机docker0的网桥地址,而端口是指向4872(我们把verdaccio的启动时的端口改为4872)
route配置
service和router配置完了,我们来添加request transformer插件,该插件是用来在request中,更改信息的。由于上面说了,指向verdaccio是需要配置header里面的host的,所以配置如下:
request transformer配置
这样我们的verdaccio的转发就配置完成了。

Nginx转发到Kong


server {
    listen 4873;
    location / {
        proxy_pass http://localhost:8010/;
        proxy_set_header X-Real-Port $remote_port;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}  

proxy_pass是指向Kong,X-Real-Port,X-Real-Ip,X-Forwarded-For是用来转发真实IP用的也是必要。

Kong配置IP白名单

  • 添加ip-restriction插件
    ip插件

  • Kong修改配置
    插件配置完后,发现IP白名单不起作用,这时候需要修改配置,如果是docker启动,启动命令请添加KONG_TRUSTED_IPS和KONG_REAL_IP_HEADER,如下:

docker run -d --name kong \
-e "KONG_TRUSTED_IPS=0.0.0.0/0,::/0" \
-e "KONG_REAL_IP_HEADER=X-Forwarded-For" \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=192.168.1.94"  \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=logs/proxy_access.log"  \
-e "KONG_ADMIN_ACCESS_LOG=logs/admin_access.log" \
-e "KONG_PROXY_ERROR_LOG=logs/proxy_error.log" \
-e "KONG_ADMIN_ERROR_LOG=logs/admin_error.log" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000  \
-p 8443:8443  \
-p 8001:8001  \
-p 8444:8444  \
kong:latest

具体原因请参考