Заметки в категории How To

Улучшаем Gnome Shell (Gnome 3)

В связи с тем, что Canonical отказалась от развития Unity и фактически выбросила всех его приверженцев за борт, пришлось искать альтернативы. KDE когда-то я использовал достаточно плотно. Хорошо в памяти сидит его тормознутость и имено поэтому он был отвергнут на самом начальном этапе.

До Unity в Ubuntu использовалась оболочка Gnome, правда, версии 2. Потому и решил посмотреть, что же нового в Gnome3 нам приготовили разработчики. Т.к. ноут давно просился переустановить систему с нуля, то я и ставил сразу Gnome Ubuntu, но можно было сделать и вот так:

$ sudo apt install ubuntu-gnome-desktop

После этого нужно выйти из системы, выбрать сеанс Gnome и войти. Ничего сложного.

В принципе, оболочка вышла достаточно удобной, но некоторые моменты несколько непривычны. Это все очень легко исправляется расширениями для Gnome.

Pixel Saver

Расширение, которое объединяет заголовок окна с верхней панелью, как в Ubuntu. Это очень удобно и экономит место на ноутбуках.

Установить Pixel Saver

No Topleft Hot Corner

В Gnome при подведении мышки в верхний левый угол автоматически всплывает меню с приложениями и рабочими столами. Иногда это сильно раздражает. Видимо не только меня, т.к. ребята сделали расширение, которое отключает эту возможность.

Нажатие на клавишу 'Win' для активации этого меню остается и вы не будете ограничены в доступе. :)

Установить No Topleft Hot Corner

Top Icons

Трей с иконками приложений в Gnome находится не на привычном месте, а реализован как слацдер в левом нижнем углу. Если он открыт постоянно, то немного мешает. Если же его скрыть (такая возможность есть штатно), то не видно уведомлений. Странное немного решение, которое можно исправить с помощью Top Icons

Trash

Маленькое расширение, которое просто показывает значек корзинке в правом верхнем углу, если она не пуста.

Установить Trash

Panel OSD

Расширение, которое позволяет настроить, в каком месте экрана будут показываться уведомления.

Вот с таким набором расширений уже можно спокойно и привычно жить. Плюс к этому я вам рекомендую настроить каждый из плагинов под себя. Большинство из них позволяют настроить поведение системы так, как вам будет комфортно и удобно работать с ними.

Gnome 3 меня пока радует. :)

Как правильно удалить пользователя MySQL/MariaDB

ВНИМАНИЕ: Сделайте резервную копию ваших данных перед запуском команд из этой инструкции!

Шаг 1 - Подключение к серверу MySQL/MariaDB

Если у вас есть необходимость удалить какой-либо продукт типа WordPress или Drupal, то вы должны удалить пользователя из базы данных. Вам нужно удалить все выданные ранее права/разрешения и только после этого удалять пользователя.

Для начала вам необходимо подключиться к базе данных:

$ mysql -u root -p mysql

или

$ mysql -u root -h db.example.com -p mysql

Шаг 2 — список всех пользователей

Для того чтоб увидеть разрешения для пользователя bloguser введите:

mariadb> SHOW GRANTS FOR 'bloguser'@'localhost';

Где:

  • bloguser — имя пользователя MySQL/MariaDB
  • localhost — имя хоста, с которого разрешено подключаться этому пользователю
  • mywpblog — имя базы данных

Шаг 3 - отзыв всех разрешений

Введите следующую sql команду:

mariadb> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 4 - Удаление пользователя

Введите следующую команду:

mariadb> DROP USER 'bloguser'@'localhost';

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

Шаг 5 - удаление базы данных

Введите следующую команду:

mariadb> DROP DATABASE mywpblog;

Пример вывода:

Query OK, 0 rows affected (0.00 sec)

На этом все. :) Вы удалили пользователя базы данных.

HTTP сервер для раздачи статики одной строкой

Иногда надо быстро поднять http сервер для отдачи какого-то одного или нескольких файликов.

Тут собраны несколько способов, как одной строкой запустить http сервер для раздачи статических файлов.

Python 2.x

$ python -m SimpleHTTPServer 8000

Python 3.x

$ python -m http.server 8000

Twisted

$ twistd -n web -p 8000 --path .

or

$ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File("."))); reactor.run()'

Ruby

$ ruby -run -ehttpd . -p8000

asdf

$ gem install adsf   # install dependency
$ adsf -p 8000

Sinatra

$ gem install sinatra   # install dependency
$ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

Perl

$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Plack

$ cpan Plack   # install dependency
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

PHP > 5.4

$ php -S 127.0.0.1:8000

busybox httpd

$ busybox httpd -f -p 8000

Свой NTP сервер в локальной сети

NTP (англ. Network Time Protocol — протокол сетевого времени) — сетевой протокол для синхронизации внутренних часов компьютера с использованием сетей с переменной латентностью.

NTP использует для своей работы протокол UDP и учитывает время передачи. Система NTP чрезвычайно устойчива к изменениям латентности среды передачи. В версии 4 способен достигать точности 10 мс (1/100 с) при работе через Интернет, и до 0,2 мс (1/5000 с) и лучше внутри локальных сетей.

Наиболее широкое применение протокол NTP находит для синхронизации серверов точного времени.

Установка на Ubuntu

sudo apt update
sudo apt install ntp

Настройка сервера

sudo mv /etc/ntp.conf{,.bak}
sudo nano /etc/ntp.conf

Добавляем в конфиг эти строки:

server 0.ru.pool.ntp.org iburst prefer
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

disable monitor

driftfile /var/db/ntpd.drift
logfile /var/log/ntpd.log

restrict 127.0.0.1

restrict 0.ru.pool.ntp.org noquery notrap
restrict 1.ru.pool.ntp.org noquery notrap
restrict 2.ru.pool.ntp.org noquery notrap
restrict 3.ru.pool.ntp.org noquery notrap

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap nopeer

Перезапускаем сервер:

sudo /etc/init.d/ntp restart

Проверяем пиры:

ntpq -c peers

Знак «+» перед пиром означает, что время было синхронизировано с этим пиром.

Теперь можно настроить свой маршрутизатор на выдачу клиентам нашего NTP сервера для синхронизации времени с ним.

Как передать статические маршруты клиентам с помощью ISC DHCP сервера

Для этого надо добавить в /etc/dhcp/dhcpd.conf строки:

option classless-routes code 121 = array of unsigned integer 8;
option classless-routes 24, 192,168,100, 192,168,1,2,
                        24, 10,4,0, 192,168,1,2;
option classless-routes-win code 249 = array of unsigned integer 8;
option classless-routes-win 24, 192,168,100, 192,168,1,2,
                            24, 10,4,0, 192,168,1,2;

Этим мы передаем клиентам два статических маршрута:

  1. Маршрут для 192.168.100.0/24 через 192.168.1.2
  2. Маршрут для 10.4.0.0/24 через 192.168.1.2

Остается перезагрузить сервис:

sudo service isc-dhcp-server restart

UPD: Есть проблема с маршрутом по умолчанию в такой конфигурации. Решение проблемы default route.

lftp: зеркалируем локальные и удаленные каталоги

lftp — программа для передачи файлов в сложных условиях ftp, http и других соединений. lftp имеет встроенную поддержку зеркалирования всего дерева каталогов. Она так же может зеркалировать в обратном режиме, т.е. сделать зеркало локального каталога на сервере, загрузив все файлы. Еще одна интересная возможность: зеркалирование двух удаленных серверов по протоколу FXP, если он доступен на серверах.

Синтаксис

mirror
mirror options
mirror -c
mirror -R

Пример: Как сделать зеркало удаленного каталога (скачать файлы)

Для начала необходимо подключиться к удаленному серверу:

lftp ftp.example.com

Введите имя пользователя и пароль:

lftp ftp.example.com:~> user user@example.com

Пример вывода:

Password:
lftp user@example.com@ftp.example.com:~>

Введите ls, чтоб увидеть список файлов:

lftp ftp.example.com:~> ls

Пример вывода:

-rw-r--r--    1 80       www      36809419 Jun 24 23:59 2012-06-24.log.gz
-rw-r--r--    1 80       www      100912271 Jun 25 23:59 2012-06-25.log.gz
-rw-r--r--    1 80       www      102926055 Jun 26 23:59 2012-06-26.log.gz

Для зеркалирования всех файлов в текущий каталог введите:

lftp ftp.example.com:~> mirror

С командой mirror вы можете указать исходный каталог и каталог назначения. Если каталог назначения будет оканчиваться на слеш («/»), то имя исходного каталога будет добавлено к каталогу назначения.

lftp ftp.example.com:~> mirror source destination

или

lftp ftp.example.com:~> mirror logs/ /data/logs

Я очень рекомендую использовать опцию, которая позволяет продолжить скачивание, если вдруг соединение оборвалось:

lftp ftp.example.com:~> mirror -c source destination

или

lftp ftp.example.com:~> mirror --continue

Чтоб скачать только новые файлы (не работает с -c):

lftp ftp.example.com:~> mirror -n

или

lftp ftp.example.com:~> mirror --only-newer

Вы можете ускорить загрузку файлов используя опцию параллельной загрузки:

lftp ftp.example.com:~> mirror -p

Чтоб указать количество потоков, введите:

lftp ftp.example.com:~> mirror --parallel=10

Пример: как сделать обратное зеркалирование (загрузка файлов)

Для создание обратного зеркала каталога вам необходимо передать опцию -R или —reverse команде mirror. Для начала вам необходимо подключиться к серверу, как было показано в предыдущем примере.

Сменить локальный каталог:

lftp ftp.example.com:~> lcd /home/silver/project/lftp

Пример вывода:

lcd ok, local cwd=/home/silver/project/lftp

Для загрузки дерева файлов и каталогов на сервер:

lftp ftp.example.com:~> mirror -R

или укажите локальный и удаленный каталоги:

lftp ftp.example.com:~> mirror -R /home/silver/project/lftp /var/www/html

Для выхода из FTP сессии:

lftp ftp.example.com:~> quit

Cron: How To

Введение

Cron - это системный демон, который используется для запуска периодических задач в фоновом режиме.

Файл crontab - простой текстовый файл со списком команд, которые должны быть выполнены в указанное время.

Каждый пользователь в системе имеет свой crontab файл, включая root. Все пользовательские файлы проверяются cron'ом вне зависимости от того, залогинен пользователь в системе или нет.

Для вывода справки по crontab введите:

man crontab

Использование Cron

Для настройки cron для вашего пользователя введите:

crontab -e

Отредактируйте файл и сохраните его для применения изменений запуска фоновых задач. Не забываенем/датой не могут содержать пробелы и содержат в себе минуты (0-59), часы (0-23, 0 - полночь), дни (1-31), месяцы (1-12), дни недели (0-6, 0 - воскресенье).

01 04 1 1 1 /usr/bin/somedirectory/somecommand

В примере выше будет выполнена команда /usr/bin/somedirectory/somecommand в 4 часа 1 минуту 1 января плюс каждый понедельник в январе.

Разделенные запятыми значения можно использовать для указания нескольких значений. Так же можно использовать дефис "-" в значениях для указания периодов.

01,31 04,05 1-15 1,6 * /usr/bin/somedirectory/somecommand

В этом случае команда будет выполнена в 01 и 31 минуты 4 и 5 часов утра с 1 по 15 января и июня.

Рекомендуется указывать полный путь к команде для запуска, как указано в примерах выше.

Иногда есть необходимость запускать команды через определенные промежутки времени. Следующий пример будет запускать команду раз в 10 минут (0, 10, 20, 30, 40 и 50 минут каждого часа):

*/10 * * * * /usr/bin/somedirectory/somecommand

Эта запись абсолютно эквивалентна:

0,10,20,30,40,50 * * * * /usr/bin/somedirectory/somecommand

Так же crontab поддерживает некоторые специальные строки, которые могут быть использованы вместо указания времени/даты:

строка что имеется ввиду
@reboot Единожды, при загрузке
@yearly Один раз в год, "0 0 1 1 *"
@annually Так же, как и @yearly
@monthly Один раз в месяц, "0 0 1 * *"
@weekly Один раз в неделю, "0 0 * * 0"
@daily Один раз в день, "0 0 * * *"
@midnight Так же, как и @daily
@hourly Один раз в час, "0 * * * *"
@reboot /path/to/execuable1

Пример выше запустит команду при старте системы.

Опции crontab

  • -l - выведет список заданий
  • -r - удалит все задания из crontab
  • -e - редактировать crontab с помощью редактора, указанного в переменной окружения EDITOR

После сохранения и выхода crontab проверит корректность файла и, если ошибок не будет обнаружено, применит изменения.

Два других способа конфигурации crontab

До этого мы говорили о пользовательских crontab файлах. В системе есть еще два способа конфигурации crontab.

ВременнЫе каталоги /etc/cron.{hourly,daily,weekly,monthly} используются для запуска скриптов. В них можно создать скрипты, которые будут выполнены один раз в час, день, неделю или месяц соответственно.

Так же есть общесистемный файл /etc/crontab, который имеет немного другой синтаксис:

00 01 * * * rusty /home/rusty/rusty-list-files.sh

В данном примере после времени/даты идет имя пользователя, с правами которого будет выполнен скрипт /home/rusty/rusty-list-files.sh

Такой же синтаксис может быть использован в crontab файлах в каталоге /etc/cron.d. В отличие от временнЫх каталогов, в это каталог складываются не скрипты для запуска, а crontab файлы с синтаксисом, показанным выше.

Переменные окружения

В crontab файле можно указывать переменные окружения. Это делают в самом начале файла:

SHELL=/bin/bash
PATH=~/bin:$PATH

Иногда надо чтоб результат работы скрипта cron отправлял на почту. Обычно он отправляет письмо тому пользователю, чей crontab файл используется. Адрес доставки письма можно переопределить с помощью переменной MAILTO:

How To: Проксируем весь трафик через ssh

Иногда надо отправить весь трафик через удаленный сервер. VPN'а и ничего другого, кроме ssh, нет. Чтоб провернуть этот фокус одной коммандой нам понадобится только python на обоих концах "туннеля" и ssh доступ.

Устанавливаем пакетный менеджер pip:

$ sudo apt install python-pip

Устанавливаем sshuttle:

$ sudo pip install sshuttle

Запускаем туннель:

$ sshuttle -r [email protected] 0.0.0.0/0

Все. С этого момента весь траффик пойдет через сервер example.com. И да, для консольных утилит тоже.

Чтоб DNS трафик пошел туда же надо добавить опцию --dns. Учтите, что если вы используете провайдерский DNS, то он может перестать отдавать записи:

$ sshuttle --dns -r [email protected] 0.0.0.0/0

Более подробное описание смотрите в официальной документации.

HowTo: использование команды grep в Linux - примеры

grep — утилита командной строки, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом.

Синтаксис

Синтаксис может быть следующим:

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

Поиск по файлу

Чтобы выполнить поиск пользователя boo в файле /etc/passwd запустите:

$ grep boo /etc/passwd

Вывод будет примерно таким:

boo:x:1000:1000:boo,,,:/home/boo:/bin/ksh

Так же вы можете выполнить регистронезависимый поиск строки boo (например, bOo, Boo, BOO и т.п.):

$ grep -i "boo" /etc/passwd

Рекурсивный поиск

Можно искать во всех файлах в каталоге:

$ grep -r "192.168.1.5" /etc/

или

$ grep -R "192.168.1.5" /etc/

Пример ла, в котором встречается искомая строка (например, /etc/ppp/options). Такое поведение можно отключить, т.е. grep не будет вставлять в результаты поиска имена файлов, добавив ключ -h:

$ grep -h -R "192.168.1.5" /etc/

или

$ grep -hR "192.168.1.5" /etc/

Пример вывода:

# ms-wins 192.168.1.50
# ms-wins 192.168.1.51
addresses1=192.168.1.5;24;192.168.1.2;

Использование grep для поиска только слов

Если вы ищете boo, то grep найдет и такое сочетание fooboo, boo123, 123boofoo и т.п. Для того чтоб grep нашел именно слово boo можно указать ключ -w:

$ grep -w "boo" file

Поиск двух разных слов

$ egrep -w 'word1|word2' /path/to/file

Подсчет количества

grep может посчитать количество вхождений слова в файл:

$ grep -c 'word' /path/to/file

Опция -n позволит вывести пронумерованные строки из файла номером этой строки:

$ grep -n 'root' /etc/passwd

Пример вывода:

1:root:x:0:0:root:/root:/bin/bash
1042:rootdoor:x:0:0:rootdoor:/home/rootdoor:/bin/csh
3319:initrootapp:x:0:0:initrootapp:/home/initroot:/bin/ksh

Инвертированный вывод

Вы можете использовать параметр -v для инвертирования вывода, т.е. вывести все строки кроме тех, в которых встречается искомое слово:

$ grep -v bar /path/to/file

Unix / Linux конвеер и grep

grep можно комбинировать с конвеером (pipe). Этот пример выведет имена жестких дисков:

# dmesg | egrep '(s|h)d[a-z]'

Показать модель CPU:

# cat /proc/cpuinfo | grep -i 'Model'

Эта же команда может быть выполнена по другому без pipe:

# grep -i 'Model' /proc/cpuinfo

Пример вывода:

model       : 30
model name  : Intel(R) Core(TM) i7 CPU       Q 820  @ 1.73GHz
model       : 30
model name  : Intel(R) Core(TM) i7 CPU       Q 820  @ 1.73GHz

Вывести только список файлов

Передав параметр -l можно вывести только имена файлов:

$ grep -l 'main' *.c

И, наконец, можно вывести результат с подсветкой:

$ grep --color vivek /etc/passwd

How To: Проксирование в приватный AWS S3 через Nginx

Проблема

Иногда нам надо давать доступ к приватному баккету в Amazon S3 с авторизацией в наших сервисах, например LDAP или банальный Basic Auth. Стандартный Nginx, к сожалению, этого не позволяет сделать. Но в интернете полно инструкций как это сделать с помощью LUA модуля Nginx. Тут я расскажу как собрать Nginx с модулем LUA и всем необходимым, чтоб можно было проксировать запросы в Amazon S3 и в конце укажу на ошибку в конфигурации из сети, которая валяется почти на каждом углу. После чего мы эту ошибку исправим.

Сборка Nginx

Для сборки нам понадобятся исходники самого Nginx, модуля LUA, Nginx Development Kit и Set Misc модуль для Nginx. Итак, устанавливаев необходимое программное обеспечение

apt install build-essential automake libgd-dev libluajit-5.1-dev libgeoip-dev

Скачиваем необходимые модули и исходники:

mkdir -p ~/tmp/nginx
wget -O ~/tmp/nginx/nginx.tar.gz http://nginx.org/download/nginx-1.11.1.tar.gz
cd ~/tmp/nginx
tar -vxzf ~/tmp/nginx/nginx.tar.gz

git clone https://github.com/simpl/ngx_devel_kit.git
git clone https://github.com/openresty/lua-nginx-module.git
git clone https://github.com/openresty/set-misc-nginx-module.git

Собираем Nginx со всеми модулями:

./configure --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module --add-module=${HOME}/tmp/nginx/ngx_devel_kit --add-module=${HOME}/tmp/nginx/set-misc-nginx-module --add-module=${HOME}/tmp/nginx/lua-nginx-module

Останавливаем сервис Nginx и заменяем бинарный файл:

sudo service nginx stop
sudo cp -f objs/nginx /usr/sbin/nginx

Теперь рассмотрим конфигурацию. Я приведу только location, т.к. если вы задумались о проксировании в AWS, то уже должны знаете, что такое конфигурация Nginx:

    location ~* ^/(.*) {
      set $bucket           'bucket-name';
      set $aws_access       'AWS_ACCESS_TOKEN';
      set $aws_secret       'AWS_ACCESS_SECRET';
      set $url_full         "$1";
      set_by_lua $now       "return ngx.cookie_time(ngx.time())";
      set $string_to_sign   "$request_method\n\n\n\nx-amz-date:${now}\n/$bucket/$url_full";
      set_hmac_sha1          $aws_signature $aws_secret $string_to_sign;
      set_encode_base64      $aws_signature $aws_signature;
      resolver               8.8.8.8 valid=300s;
      resolver_timeout       10s;
      proxy_http_version     1.1;

      proxy_set_header       Host $bucket.s3.amazonaws.com;
      proxy_set_header       x-amz-date $now;
      proxy_set_header       authorization "AWS $aws_access:$aws_signature";
      proxy_buffering        off;
      proxy_intercept_errors on;

      rewrite .* /$url_full break;
      proxy_pass             http://$bucket.s3.amazonaws.com;
    }

Нужно подставить ваши ключи доступа к AWS и все должно заработать как надо. Но тут есть одна проблема. Если вы храните в баккете файлы с именами без пробелов, то вы ее не заметите. Все будет работать и так. Но если вам попадется файл с пробелом в имени, то Амазон вам его не отдаст с ошибкой о некорректной сигнатуре.

Это и есть та самая проблема о которой я говорил выше. Почему так происходит? Все дело в том, что Амазон пробел заменяет на знак "+", а мы кодируем его как "%20". Т.е. сервис Амазона не видит такого файла вообще.

Поскольку проблема понятна, то и решить ее можно достаточно легко с помощью все того же LUA:

    set_by_lua $url_decoded "return ngx.re.gsub(ngx.var.url_full, '%20', '+')";

Что происходит в этой строке:

  1. Устанавливаем переменную \$url_decoded с помощью LUA
  2. Пишем в нее результат от ngx.re.gsub - это функции замены
  3. ngx.var.url_full - переменная в которой будет делаться поиск
  4. '%20' - то, что ищем
  5. '+' - то, на что меняем

И дальше в конфиге заменить везеде \$url_full на \$url_decoded. Результирующий конфиг будет такой:

  location ~* ^/(.*) {
    set $bucket           'bucket-name';
    set $aws_access       'AKIAJAL2RFUF73T66RBA';
    set $aws_secret       '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';
    set $url_full         "$1";
    set_by_lua $url_decoded "return ngx.re.gsub(ngx.var.url_full, '%20', '+')";
    set_by_lua $now       "return ngx.cookie_time(ngx.time())";
    set $string_to_sign   "$request_method\n\n\n\nx-amz-date:${now}\n/$bucket/$url_decoded";
    set_hmac_sha1          $aws_signature $aws_secret $string_to_sign;
    set_encode_base64      $aws_signature $aws_signature;
    resolver               8.8.8.8 valid=300s;
    resolver_timeout       10s;
    proxy_http_version     1.1;

    proxy_set_header       Host $bucket.s3.amazonaws.com;
    proxy_set_header       x-amz-date $now;
    proxy_set_header       authorization "AWS $aws_access:$aws_signature";
    proxy_buffering        off;
    proxy_intercept_errors on;

    rewrite .* /$url_decoded break;
    proxy_pass             http://$bucket.s3.amazonaws.com;
  }

Теперь можно запускать сервис Nginx:

sudo service nginx start

Авторизацию, я думаю, вы и сами уже умеете прикручивать к Nginx. ;)