保护你的服务,防止被滥用!

前言

最近随着deepseek大火,越来越多的人喜欢使用ollama来部署他们的大模型,也许你懂安全只是一时大意,也许你不懂安全。不管怎么样,对于我们部署到公网上的服务,或者你的内网机器可以被公网访问,在部署时一定要注意隔离,否则自己幸苦部署的服务不但为有心之人做了嫁衣,还可能造成财产损失。

下面的是一张在shodan上搜索ollama的截图。为了保护别人的利益,这里关键信息我还是打了码。

这里过滤下 使用ollama is running来搜索,也有180多个结果。

随便点一个进去之后访问。

我们复制链接,放到自己的anythingLLM里面,可以正常刷新出来列表,换句话说,我们可以在自己的客户端上毫无保留的使用别人部署的服务。

上述的过程只是一个简单的示例,说这些并不是让大家去利用别人的服务,而是说,我们在搭建自己的服务的时候,一定要注意安全配置,不要一股脑的配置好,然后能用就行了,这个是非常不可取的。

题外话

在互联网上,我们最常用的搜索引擎是 Google、Bing 或 Baidu,它们主要索引的是 网页内容。但 Shodan、ZoomEye 这类搜索引擎与普通的 Web 搜索引擎截然不同,它们被称为 “网络空间搜索引擎”,主要用于扫描和索引 互联网设备、服务和开放端口。这里简单介绍下,详细的大家可以去网上搜索了解。

Shodan 和 ZoomEye:与普通 Web 搜索引擎的区别

在互联网上,我们最常用的搜索引擎是 Google、Bing 或 Baidu,它们主要索引的是 网页内容。但 Shodan、ZoomEye 这类搜索引擎与普通的 Web 搜索引擎截然不同,它们被称为 “网络空间搜索引擎”,主要用于扫描和索引 互联网设备、服务和开放端口

什么是 Shodan 和 ZoomEye?

Shodan
  • Shodan(https://www.shodan.io/)被称为 “黑客的搜索引擎”,由 John Matherly 在 2009 年创建。
  • 它主要用于扫描和索引全球范围内的 互联网连接设备,包括:
    • 服务器
    • 物联网(IoT)设备,如摄像头、智能家居设备
    • 工控系统(SCADA)
    • 数据库(如 Elasticsearch、MongoDB、Redis)
    • VPN 服务器等
  • 由于 Shodan 能够发现 暴露在互联网上的未加密或配置错误的设备,它在 安全研究网络防御 领域非常受欢迎。
ZoomEye
  • ZoomEye(https://www.zoomeye.org/)是中国白帽安全团队 Knownsec 404 开发的网络空间搜索引擎。
  • 它的功能与 Shodan 类似,但更侧重于:
    • 全球互联网资产测绘
    • Web 应用程序指纹识别
    • 漏洞扫描
  • ZoomEye 能搜索的不仅仅是 IP 和端口,还能直接搜索 网页内容、Web 组件指纹、漏洞利用情况 等。
关键区别
  • Shodan 和 ZoomEye 不是通过爬取网页数据,而是主动扫描全球 IP 地址,并记录每个 IP 的开放端口、运行的服务、证书信息等。
  • Shodan 主要基于 banner 抓取,而 Google/Bing 是基于 网页索引
  • Google 只能查找到存在的网页,但无法直接查找服务器、摄像头、数据库等开放端口的设备信息。

Shodan 和 ZoomEye 的工作原理

  这两个搜索引擎的核心技术是 网络扫描协议指纹识别。它们的工作方式如下:

IP 端口扫描

  通过类似 Nmap 的方式,对互联网范围内的 IP 进行主动扫描。发现开放的端口(如 80、443、22、3306 等)。

  连接到开放的端口,获取该端口返回的信息(Banner)。   例如,一个 HTTP 服务器的 banner 可能是: HTTP/1.1 200 OK Server: Apache/2.4.41 (Ubuntu)   通过这些 banner,Shodan 和 ZoomEye 可以识别出服务器类型、版本号、可能的漏洞等。

数据存储与索引

  这些扫描数据会被存储在数据库中,用户可以通过关键词查询某些特定的设备或服务。

可视化展示

  例如,Shodan 提供了 全球地图,可以显示某个国家/地区开放的服务数量。

HOW TO DO

危险无处不在,我们该如何?

重中之重

  • 重中之重的是不要把任何没有安全验证的服务部署到公网上。除非你是需要访问的文档或者博客等。

做好隔离

  慎用0.0.0.0,做好隔离。比如说,现在我想部署一个anythingLLM的服务给朋友用,

  • 现在有两种情况,你的AnythingLLM和ollama的服务放在同一台机器上,这个时候ollama的服务就启动为127.0.0.1即可。
  • 如果和你的两个服务放在不同的机器上,这里又有两种情况了。
    • 如果说你的两个服务器只有一个网络,那么你只能将ollama的服务启动为0.0.0.0或者你的服务器的公网地址,并且在ipatables或者使用其他的防火墙软件(centos系列用firwall-cmd或者ubuntu系列用ufw)来设置只允许你的另外一个机器的地址来访问;
       # 如果默认未开放8080
       sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="8080" accept'
       #  之前开放的删除
       sudo firewall-cmd --permanent --remove-port=8080/tcp
       sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="8080" accept'
       # 之前开放的不想删除
       sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="8080" drop'
       sudo firewall-cmd --reload
      
    • 另外如果你的两台服务器不仅有公网地址,内网地址也是连通的,那么建议你将ollma的启动地址设置为内网的地址,然后将AnythingLLM的启动地址设置为公网地址。

利用nginx做反向代理

  • Nginx(发音:Engine-X)是一款高性能的Web 服务器和反向代理服务器,广泛用于网站托管、负载均衡和 API 网关等场景。他的功能非常强大,这里就举一个简单的例子来将你的服务通过nginx进行反代。
  • 首先是nginx的安装和启动,有些服务器默认是安装好的,如果没有安装好的话可以使用apt install nginx 或者 yum install nginx来安装,看你是Debian系列还是redhat系列。
  • 关于启动,nginx的启动有好几种方式,但是推荐大家使用(systemctl)来管理。
    • docker 启动
    • nginx 命令直接启动
    • init.d脚本(老版本的Linux会用到这个,现在基本不用了)
    • systemctl/service 服务方式启动,启动后查看状态如下所示的话,就说明是正常的。
  • 关于配置(这里以服务方式启动来举例)
    • 推荐在/etc/nginx/conf.d目录添加自己的配置文件,不要直接在nginx.conf里面修改。
    • 比如创建一个demo.conf 添加如下内容
      • server_name 里面是你的域名
      • proxy_pass 里面填写你的服务的地址。
      • 其他的可以参照我的这个配置来写。
         server {
         listen 80;
         server_name *.yourdomain.com ;
        
         location / {
            proxy_pass http://127.0.0.1:12345;  
            proxy_set_header Host $host;
            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;
         }
        
    • 完成之后重新加载服务然后重启服务即可成效(注意这里是两个步骤)
  • 小技巧
    • nginx虽然强大,但是在日常使用的过程中还是遇到很多次进程异常退出的情况,这里介绍一个小技巧。
      • nginx在启动后会在将进程号保存到/var/run/nginx.pid文件里面,有的时候如果因为一些异常进程死掉了但是这个pid文件在,那么你启动的时候就会失败!
      • 这个时候可以先执行下nginx然后将获取到的进程号手动写入nginx.pid文件,完成之后再执行nginx -s reload就没有问题了。但是这个时候nginx就以命令的形式启动了,如果想继续以服务的形式启动,就再执行nginx -s stop停止掉进程之后,再以服务形式启动(systemctl restart nginx)就🆗了。

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 如何保护你部署的服务 》

本文链接:http://0.0.0.0:3015/tech/how-to-proect-your-serivces-when-deployed.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!