{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket-name/*",
"Condition": {
"StringEquals": {
"aws:UserAgent": [
"<какой-то рандомный токен>"
]
}
},
"Principal": "*"
}
]
}
После чего коллеги, ответственные за фронт, проксировали силами Nginx, подставляя указанный User-Agent в заголовки.Но однажды у нас появился S3-сервер на SeaweedFS, да еще и не самой свежей версии :)
Там доступ по User-Agent сходу прикрутить не удалось.
А как вы прекрасно знаете, авторизоваться по ACCESS_KEY/SECRET_KEY не очень-то просто, вот пример со stackoverflow:
#!/bin/sh
file=path/to/file
bucket=your-bucket
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`"
stringToSign="GET
${contentType}
${dateValue}
${resource}"
s3Key=xxxxxxxxxxxxxxxxxxxx
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
signature=`/bin/echo -en "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://${bucket}.s3.amazonaws.com/${file}
Конечно, такое можно прикрутить в Nginx (с помощью встроенного в Nginx модуля Perl), есть про это статья на Опеннете ("Проксирование запросов к S3 с помощью nginx и angie").Решение показалось не изящным, плюс недостатки нашего S3-сервера пришлось бы решать коллегам из фронтенда, а перекладывание работы на других -- не наш метод.
Поэтому мы решили проксировать у себя. Прямо на S3-сервере с SeaweedFS. С помощью s3-proxy от oxyno-zeta.
Качаем бинарник (и, при желании, упаковываем в deb-пакет, если надо) отсюда https://github.com/oxyno-zeta/s3-proxy.
Кладём в /opt/s3-proxy/s3-proxy, а конфиг в /opt/s3-proxy/conf/s3proxy.yml
log:
level: info
format: text
metrics:
disableRouterPath: false
server:
listenAddr: ip-адрес-сервера
port: 8080
authProviders:
basic:
provider1:
realm: basic
targets:
target1:
mount:
path:
- /my-bucket-name/
resources:
- path: /my-bucket-name/*
provider: provider1
basic:
credentials:
- user: username1
password:
value: somePass
bucket:
name: my-bucket-name
prefix:
region: eu-west-1
s3Endpoint: localhost:8333
disableSSL: true
credentials:
accessKey:
value: xxxXXXxxx
secretKey:
value: XXXxxxXXX
Готовим systemd:
[Unit] Description=S3 Proxy After=network.target Documentation=https://oxyno-zeta.github.io/s3-proxy/ [Service] Type=simple User=root WorkingDirectory=/opt/s3-proxy ExecStart=/opt/s3-proxy/s3-proxy Restart=on-failure [Install] WantedBy=multi-user.target
Проверяем:
$ wget http://username1:somePass@servername:8080/my-bucket-name/9.jpeg --2025-08-06 16:59:26-- http://username1:*password*@servername:8080/my-bucket-name/9.jpeg Распознаётся servername (servername)… 1.2.3.4 Подключение к servername (servername)|1.2.3.4|:8080... соединение установлено. HTTP-запрос отправлен. Ожидание ответа… 401 Unauthorized Выбранная аутентификация: Basic realm="basic" Повторное использование соединения с servername:8080. HTTP-запрос отправлен. Ожидание ответа… 200 OK Длина: 197222 (193K) [image/jpeg] Сохранение в: «9.jpeg» 9.jpeg 100%[======================================================================================================>] 192,60K --.-KB/s за 0,003s 2025-08-06 16:59:26 (66,9 MB/s) - «9.jpeg» сохранён [197222/197222]s3-proxy умеет гораздо больше, на их wiki всё написано.
Теперь сообщаем коллегам, что к нам в S3 надо ходить не с User-Agent, а на новый порт 8080 с Basic Auth username1/somePass.
Комментариев нет:
Отправить комментарий