OSS在private权限下的无参数访问(Nginx反向代理实现)

简介: 本文主要介绍内容 oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险。如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用。本文会介绍如何利用nginx反向代理实现private权限下无参数访问oss资源。

本文主要介绍内容

oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险。如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用。本文会介绍如何利用nginx反向代理实现private权限下无参数访问oss资源。


运行环境说明

本文实现环境是:
Centos7 系统 + nginx: 1.14.1


前期准备工作

  • nginx安装njs模块(使用yum安装,也可源码编译安装)

yum install nginx-module-njs

  • 创建脚本文件

本文是将脚本放置与nginx/njs/目录下,文件名为oss-sign.js,你也可以放置到任何你喜欢的地方,只要以下提到的配置目录正确即可。

文件内容详见 代码文件

  • 修改nginx相关配置文件

修改nginx/nginx.conf文件,修改内容如下,非修改内容省略

#--start-- 引入njs模块 
load_module modules/ngx_http_js_module.so;
#--end--

http {
  #--start-- 
  # 以上内容省略,这段代码需放置与include之前, http代码段之中
  # js_include指令后接脚本文件路径
  js_include njs/oss-sign.js;
  # 定义签名字符串和GMT时间字符串
  js_set $ossDate getGMTtime;
  js_set $ossAuth ossSign;
  #--end--

  include /etc/nginx/conf.d/*.conf;
}
  • 虚拟服务主机方式

conf.d/目录下创建oss.conf文件,内容如下

server {
    server_name  oss.xxxxx.com; # oss域名,替换成你自己的域名
    server_name_in_redirect off; # 多域名防干扰,详细说明可自行查阅

    location / {
      # 反向代理oss地址,需替换成你的oss内网或外网地址
      proxy_pass http://xxx.oss-cn-xxx-internal.aliyuncs.com;
      # 设置反向代理时请求header, 也是本方案核心内容
      # $ossDate, $ossAuth 变量名需和nginx.conf文件内变量名一致
      proxy_set_header Date $ossDate;
      proxy_set_header Authorization $ossAuth;
    }

}
  • 其他方式

具体内容视情况而定,但主要是反向代理时添加的header字段,和上面类似

  • 重启nginx

service nginx restart

其他系统可视具体文档


结束

接下来就是见证奇迹的时刻!在浏览器里输入你的域名 + oss资源路径,然后按回车,如果不出意外,图片就能正常显示了。

_

脚本具体代码

oss-sign.js

/* 
  创建待签名字符串 
  此方法为简化版,仅处理不带url参数的oss资源地址,其他情况可结合oss文档 + ali-oss sdk 文件内signUtil模块内的buildCanonicalString方法做修改
*/
function buildCanonicalString (method, resourcePath, date) {
  var signContent = [method.toUpperCase(), '', '', date, resourcePath]
  return signContent.join('\n')
}
/* 计算签名字符串 */
function computeSignature (accessKeySecret, canonicalString) {
  var signature = require('crypto').createHmac('sha1', accessKeySecret)
  return signature.update(canonicalString.toUTF8()).digest('base64')
}
/* 生成完整认证字符串 */
function authorization (accessKeyId, accessKeySecret, canonicalString) {
  return 'OSS ' + accessKeyId + ':' + computeSignature(accessKeySecret, canonicalString)
}
/* oss签名配置数据,换成你自己的PAM账号的AK和bucket */
var ossAccess = {
  accessKeyId: 'XXXXX',
  accessKeySecret: 'XXXX',
  bucket: 'XXX'
}
var GMTdate = ''
/* 返回oss header date字符串 */
function getGMTtime (r) {
  /* 函数运行在http环境,如果有多个server最好加上判断条件来避免不必要的消耗 */
  if (r.headersIn.host !== 'oss.xxxx.com') return ''
  /* nginx 环境下 toUTCString 函数和标准有差异, 此处做转换处理,后续njs版本升级后可能需要修改 */
  var dateWords = new Date().toUTCString().split(' ')
  dateWords[0] += ','
  dateWords[1] = [dateWords[2], dateWords[2] = dateWords[1]][0]
  GMTdate = dateWords.join(' ')
  return GMTdate
}
/* 返回oss header authorization字符串 */
function ossSign (r) {
  if (r.headersIn.host !== 'oss.xxxx.com') return ''
  var method = r.method
  var canonicalString = buildCanonicalString(method, '/' + ossAccess.bucket + r.uri, GMTdate)
  return authorization(ossAccess.accessKeyId, ossAccess.accessKeySecret, canonicalString)
}
相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
相关文章
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1749 5
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
728 60
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
753 60
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
4054 8
|
存储 对象存储 索引
对象存储OSS-m3u8视频私有权限
当上传至私有存储桶的M3U8视频缺少签名信息时,会导致播放失败(403错误)。解决方案是使用OSS的动态签名机制,在首次访问M3U8文件时,通过在URL中添加`x-oss-process=hls/sign`参数,OSS将自动对所有TS切片地址进行签名,确保视频正常播放。
969 2
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
1108 3
|
Web App开发 算法 应用服务中间件
nginx开启局域网https访问
【10月更文挑战第22天】为了调试WebRTC功能,需要在局域网内搭建HTTPS协议。具体步骤包括:在已部署Nginx和安装OpenSSL的环境中生成私钥、证书签名请求和自签名证书;将生成的文件放置到Nginx的证书目录并修改Nginx配置文件,最后重启Nginx服务。注意,自签名证书不受第三方机构认可,如需正式使用,需向CA申请签名。
757 2
|
应用服务中间件 nginx
Nginx:怎么携带参数重定向
通过合理配置Nginx的 `rewrite`指令和 `return`指令,可以实现携带参数的重定向。这不仅可以确保用户请求被正确重定向,还可以保留原始查询参数,满足更多复杂的重定向需求。
441 2
|
应用服务中间件 nginx
Nginx:怎么携带参数重定向
通过合理配置Nginx的 `rewrite`指令和 `return`指令,可以实现携带参数的重定向。这不仅可以确保用户请求被正确重定向,还可以保留原始查询参数,满足更多复杂的重定向需求。
815 1
|
应用服务中间件 Shell PHP
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
windows系统配置nginx环境运行pbootcms访问首页直接404的问题