- Сообщения с 26 по 50 из 61
- 26 2010-12-13 20:39:19
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 27 Ответ от Юлия Бойко 2010-12-13 23:36:04
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 28 Ответ от greahem 2011-03-15 12:13:28 (изменено: greahem, 2011-03-15 12:15:13)
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 29 Ответ от DmitryV 2011-03-15 14:55:13 (изменено: DmitryV, 2011-03-15 14:58:06)
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 30 Ответ от Alanamana 2011-06-02 21:32:05 (изменено: Alanamana, 2011-06-02 21:33:34)
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 31 Ответ от Hanut 2011-06-02 23:11:20
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 32 Ответ от Alanamana 2011-06-03 14:22:32
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 33 Ответ от Meehan 2012-01-27 16:50:09
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 34 Ответ от Hanut 2012-01-27 17:09:58
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 35 Ответ от Meehan 2012-01-27 17:24:24 (изменено: Meehan, 2012-01-27 17:47:38)
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 36 Ответ от Hanut 2012-01-27 19:21:06
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 37 Ответ от Meehan 2012-01-27 19:33:14
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 38 Ответ от Hanut 2012-01-27 19:49:25
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 39 Ответ от Meehan 2012-01-27 19:54:46
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 40 Ответ от Hanut 2012-01-27 20:11:44
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 41 Ответ от Meehan 2012-01-27 20:18:25 (изменено: Meehan, 2012-01-27 20:18:52)
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 42 Ответ от Meehan 2012-01-27 22:14:57
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 43 Ответ от Hanut 2012-01-27 22:30:57
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 44 Ответ от Meehan 2012-01-27 22:33:16
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 45 Ответ от Hanut 2012-01-27 22:43:55
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 46 Ответ от User-712 2012-05-30 12:31:21 (изменено: User-712, 2012-05-30 12:33:00)
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 47 Ответ от Олег Иванович 2013-01-18 11:57:37
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 48 Ответ от Hanut 2013-01-18 12:33:54
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 49 Ответ от Олег Иванович 2013-01-18 13:33:04
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- 50 Ответ от Hanut 2013-01-18 19:54:32
- Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
- Why does MYSQL say ‘Access denied for user ‘root’@’localhost’?
- Solution:
- Solution:
- Solution:
- Solution:
- FAQs
- 1. Where is the MYSQL error log?
- How to change the root password for MySQL?
- How to recover the root password for MySQL?
- Project Setup
- Docker
- Notes
- Gunicorn
- Production Dockerfile
- Nginx
- Static Files
- Development
- Production
- Development
- Production
- Objectives
- What is Vault?
- Auditing
- Static Secrets
- CLI
- API
- Policies
- Encryption as a Service
- Dynamic Secrets
- AWS Credentials
- Leases and Revocation
- Access denied for user ‘[email protected]’ (using password
- Solutions
- Similar questions
- How do I reset my localhost MySQL password?
- What is default MySQL root password?
- What is the default root password for MySQL in ubuntu?
- How do I change the root password in MySQL 8?
Сообщения с 26 по 50 из 61
26 2010-12-13 20:39:19
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Юлия Бойко сказал:
Пароль был установлен у root?
27 Ответ от Юлия Бойко 2010-12-13 23:36:04
- Юлия Бойко
- Зарегистрирован: 2010-12-12
- Сообщений: 2
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Изначально нет, но после того , как я добавила пароль, то появилась вышеуказанная ошибка!
Благодарю, за то, что отозвались, но у меня уже получилось справиться с проблемой.Честно говоря , так и не поняла, какое из моих действий посодействовало этому))), т.к. я и кеш чистила во всех браузерах, и Денвер переустанавливала, надеясь, что это поможет)))))) Вообщем, была в панике)))
28 Ответ от greahem 2011-03-15 12:13:28 (изменено: greahem, 2011-03-15 12:15:13)
- greahem
- Откуда: Тольятти
- Зарегистрирован: 2011-03-15
- Сообщений: 1
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Всем добрый день!Сегодня тоже столкнулся с этой же проблемой. Благо последние мои действия в PMA, которые и привели к ошибке помню, поэтому разбирался недолго.Накануне я создал новую базу данных и менял привилегии, а именно задал пароль для имеющегося пользователя root.Чтобы исправить ситуацию, надо открыть файл config.inc.php и в строке:
$cfg['Servers'][$i]['password'] = '';между апострофами вставить пароль, который задавали через административную панель web. Сохраняете изменения и все работает.
29 Ответ от DmitryV 2011-03-15 14:55:13 (изменено: DmitryV, 2011-03-15 14:58:06)
- DmitryV
- Откуда: Санкт-Петербург, Россия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Юлия Бойко измените строку:
$cfg['Servers'][$i]['auth_type'] = 'config';на строку:
$cfg['Servers'][$i]['auth_type'] = 'cookie';и добавьте строку:
и укажите логин и пароль при входе в форме, не перепутайте язык и регистр.
30 Ответ от Alanamana 2011-06-02 21:32:05 (изменено: Alanamana, 2011-06-02 21:33:34)
- Alanamana
- Зарегистрирован: 2011-06-02
- Сообщений: 2
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Приветствую. Вы можете мне помочь, пожалуйста. У меня возникла подобная ошибка:
MySQL Error!
————————
The Error returned was:
Access denied for user ‘barbiiik_sv’@’localhost’ (using password: YES)
Error Number:
1
После того, как я установил чат на сайт, сразу пропал сам сайт (вместо него выдает, что написал выше) и форум теперь тоже не работает выдает, что Ошибка базы данныхВ базе данных произошла ошибка.
Подскажите, что я не так сделал и как это исправить. Возможно это возникло из-за того, что был установлен пароль для базы данных или я что-то сделал не так. Чат я загружал не в корень сайта, а в папку форума.
Что делать, вы мне поможете? Может что нужно исправить или внести изменения в базу данных? Причем к примеру радио работает…
31 Ответ от Hanut 2011-06-02 23:11:20
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Alanamana сказал:
Возможно это возникло из-за того, что был установлен пароль для базы данных
Если вы меняли пароль в phpMyAdmin, например, то надо было его поменять и в конфигурационных файлах скриптов, которые работают с базой данных. Проверьте, можете ли вы зайти в phpMyAdmin и если можете, то определите имя пользователя и пароль MySQL которые вы используете, после чего отредактируйте конфигурационные файлы всех скриптов, которые подключаются к БД.
32 Ответ от Alanamana 2011-06-03 14:22:32
- Alanamana
- Зарегистрирован: 2011-06-02
- Сообщений: 2
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Hanut сказал:
Возможно это возникло из-за того, что был установлен пароль для базы данных
Нашел проблему, благодоря вашему совету, спасибо.
33 Ответ от Meehan 2012-01-27 16:50:09
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Всем привет. Тоже такая же ошибка Access denied for user ‘root’@’localhost’ (using password: YES)
думал переуставновить MySQL. Так он теперь не ставится. В самом конце настройки вот такое вылазит

что здесь можно сделать?заранее спасибо
34 Ответ от Hanut 2012-01-27 17:09:58
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Meehan сказал:
что здесь можно сделать?
Попробуйте перед установкой отключиться от Интернет и выключить антивирус и брандмауэр.
Убедитесь, что вы не ставили пароль пользователю root, иначе его надо указать при установке.
35 Ответ от Meehan 2012-01-27 17:24:24 (изменено: Meehan, 2012-01-27 17:47:38)
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
попробовал установить при отключенном интернете антивирусе брандмауэре, та же ошибкапопробовал при установке не вводить пароль, получилосьпросто устанавливал по статье Инструментарий веб-разработчика там говорят нужно парольпотом не будет проблем из-за пароля?
ввожу в адресную строку браузера localhost/phpmyadmin
а там такое

36 Ответ от Hanut 2012-01-27 19:21:06
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Meehan сказал:
Значит при установке MySQL вы не вводили пароль.
Что вы прописали в конфигурационном файле phpMyAdmin в переменной пароля root?
37 Ответ от Meehan 2012-01-27 19:33:14
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
я ж говорю, что не ввел пароль и получилось установить
Meehan сказал:
попробовал установить при отключенном интернете антивирусе брандмауэре, та же ошибкапопробовал при установке не вводить пароль, получилосьпросто устанавливал по статье Инструментарий веб-разработчика там говорят нужно парольпотом не будет проблем из-за пароля?
в переменной пароля ничего не писал, так как пароль я ж не устанавливал
38 Ответ от Hanut 2012-01-27 19:49:25
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Meehan сказал:
в переменной пароля ничего не писал,
Ошибка пишет using password: YES. Значит пароль прописан. Попробуйте очистить куки браузера или использовать альтернативный браузер.
39 Ответ от Meehan 2012-01-27 19:54:46
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
ввел пароль в файле config.inc.phpтеперь в браузере такое выскакаивает

40 Ответ от Hanut 2012-01-27 20:11:44
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
В php.ini обратите внимание на строку:
session.save_path = "C:/php/tmp"Каталог C:/php/tmp необходимо создать самостоятельно.
41 Ответ от Meehan 2012-01-27 20:18:25 (изменено: Meehan, 2012-01-27 20:18:52)
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
создал папку C:/php/tmpтеперь опять
строка session.save_path = «C:/php/tmp» есть
42 Ответ от Meehan 2012-01-27 22:14:57
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
нажал на синий знак вопроса после слов Ответ MySQL
открылась новая страница в браузере, там ввел пользователь и пароль и вошел в phpmyadmin
как это? и почему?
43 Ответ от Hanut 2012-01-27 22:30:57
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Meehan сказал:
как это? и почему?
Куки браузера надо было очистить.
44 Ответ от Meehan 2012-01-27 22:33:16
- Meehan
- Зарегистрирован: 2012-01-27
- Сообщений: 16
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
куки чистил
вошел в phpmyadmin
там изменил пароль на всякий случай, теперь заходит нормально
Hanut, спасибо огромное за то, что со мной возился.
45 Ответ от Hanut 2012-01-27 22:43:55
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Пожалуйста. Хорошо, что разобрались.
46 Ответ от User-712 2012-05-30 12:31:21 (изменено: User-712, 2012-05-30 12:33:00)
- User-712
- Зарегистрирован: 2012-05-30
- Сообщений: 2
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Для тех у кого ошибка на Denwer’e.
1. Хотел зайти на сайт, пишу в строке браузера (localhost/mysite) и а вместо сайта сообщение об ошибке *Нет доступа к базе данных*. (только на англ.)
2. Попытался зайти в phpmyadmin и получил сообщение: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO).
Впервые с таким столкнулся, два часа потратил но решение нашел.
Заходим в службы (Панель управления — Администрирование — Службы), там находим MySql (Смотрим исполняемый файл, у меня после установки сторонней программы он изменился на c:\mysql\bin\mysqld-nt.exe MySQL).
Решение очень простое. Останавливаем службу MySQL (Тип запуска меняем на *Отключена*.), перезагружаем комп, включаем Denwer.
Все работает. ![]()
47 Ответ от Олег Иванович 2013-01-18 11:57:37
- Олег Иванович
- Зарегистрирован: 2013-01-18
- Сообщений: 18
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Добрый день, прочёл все сообщения в данной теме, попробовал все варианты, но у меня проблема так и не решилась, прошу помощи!!!!!
48 Ответ от Hanut 2013-01-18 12:33:54
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Олег Иванович сказал:
Добрый день, прочёл все сообщения в данной теме, попробовал все варианты, но у меня проблема так и не решилась, прошу помощи!!!!!
Какой веб сервер у вас установлен? Денвер, или что-то еще?
49 Ответ от Олег Иванович 2013-01-18 13:33:04
- Олег Иванович
- Зарегистрирован: 2013-01-18
- Сообщений: 18
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Apache 2.2.22
Hanut сказал:
Олег Иванович сказал:
Добрый день, прочёл все сообщения в данной теме, попробовал все варианты, но у меня проблема так и не решилась, прошу помощи!!!!!
Какой веб сервер у вас установлен? Денвер, или что-то еще?
50 Ответ от Hanut 2013-01-18 19:54:32
- Hanut
- Откуда: Рига, Латвия
Re: #1045 — Access denied for user ‘root’@’localhost’ (using password: NO)
Олег Иванович сказал:
Если MySQL устанавливали самостоятельно, то при его установке должны были задать пароль пользователя root. Вы устанавливали пароль при установки MySQL?
Страницы Назад 1 2 3 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Why does MYSQL say ‘Access denied for user ‘root’@’localhost’?
In all simplicity, you are facing the error ‘Access denied for user ‘root’@’localhost’ because as the root user, you do not have the adequate privilege (permission, in other terms) to access the MySQL database.
Now, to further the discussion, you could be facing the issue due to multiple reasons, some of which include:
- When a user is non-existent to the MySQL server tries accessing the MySQL database.
- When no privilege exists for the user (as mentioned).
- If the user inputs the wrong username or password.
Now the error ‘Access denied for user ‘root’@’localhost’ is extensively of two types:
- access denied for user ‘root’@’localhost’ (using password: yes)
- access denied for user ‘root’@’localhost’ (using password: no)
The former error message is thrown up when the root user tries to access the MySQL database with the password ‘yes’, which is wrong or different from the original password. Similarly, the latter error message occurs when the root user enters the password as ‘no’, which is incorrect.
Now that you know what could possibly be restraining you from accessing the database and throwing the message ‘Access denied for user ‘root’@’localhost’, below we look at X solutions to fix the same.
Solution:
In theory, it is the lack of permissions that throw the error ‘Access denied for user ‘root’@’localhost’. To provide all the permissions to the root user, you can use the ‘grant’ command to add privileges. Use the following chain of commands to grant privileges to the root user:
mysql> CREATE USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
or
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
mysql> grant all privileges on *.* to ‘root’@’localhost’ identified by ‘password’ with grant option;
mysql> FLUSH PRIVILEGES;
To take away the privileges and revert the changes, you can use the ‘revoke’ command. The ‘revoke’ command will do exactly what it sounds like: revoke all the privileges from the root user once you choose to remove the permissions/privileges.
Solution:
If your MySQL 5.7 (or higher version) is running in Ubuntu systems, the root user is to be authenticated using not the password but the auth_sccket plugin by default.
Although this can come in handy and provide great usability and security, it can cause difficulty when you are trying to allow programs from the outside, such as phpMyAdmin, to access the user.
The main solution to this is to connect MySQL as root by switching authentication from auth_socket to mysql_native_password in the terminal:
sudo mysql
- ALTER USER command to configure the root account and change the authentication type to password.
ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
- FLUSH PRIVILEGES; in the command prompt.
SELECT user,authentication_string,plugin,host FROM mysql.user;
- Once confirmed, exit MySQL shell using
exit
Solution:
This method works specifically for all macOS users.
- Firstly, install a version of MySQL that is compatible with your MacOS’s version.
root <root-password>
- Select Use Legacy Password Encryption from the two options available, the other one being Use Strong Password Encryption.
- Using the search tool, openMySQL.prefPane and select the configuration tab.
- Click ‘Select’ option of the ‘Configuration File’ and select/private/etc/my.cnf
[mysqld]
skip-grant-tables
With skipping the grant table, you can log in from anywhere and do almost anything on the database server.
- Next, restart MySQL as follows:
ps aux | grep mysql
kill -9
- Upon restarting, run the following command to fix the error:
/usr/local/mysql—macos-x86_64/bin/mysql -uroot -p
Solution:
As we mentioned previously, you could be facing the error because you have been feeding the server the wrong password. Whether you don’t know the password or forgot the correct one, here is how you can reset it, so you can access the MySQL database as a root user again:
- /etc/mysql/my.cnf from Configuration File. Now add ‘skip-grant-tables’ mysqld] section. Note that ‘skip-grant-tables’ is dangerous; therefore make sure to remove it towards the end of the solution.
- Restart MySQL with the command given below:
service mysql restart
- Since you have added the line of code ‘skip-grant-tables‘ already, you will be able to log in since MySQL will be skipping the grant-tables. Use the command below to log in:
mysql -u root
- Once logged in, flush privileges that are restraining you from accessing the database originally using the command below:
mysql> flush privileges;
- Now, set a new password using the command below:
Password=PASSWORD(‘my_password’) where USER=’root’;
FLUSH PRIVILEGES;
- Since you have already reset the password, it is time to remove ‘skip-grant-tablesetc/mysql/my.cnf
- Restart MySQL again and log in using the new password. The service will no longer show the error.
FAQs
1. Where is the MYSQL error log?
Error logs are one of the most important logs in terms of IT operations because it helps in detecting and diagnosing functional problems that simply improves performance.
The MYSQL error log basically contains error messages, warnings and different notes which are created during the startup and shutdown phases.
MYSQL error logging is always enabled and allows the users to set destination, verbosity levels and time zone.
A file or the console is a general location or, say, destination of error logs. When no location is specified, then in windows, the error logs are written to host_name.err ( host_name is the host system name) in the data directory, whereas in UNIX/Linux, the console is the default destination of errors.
A user can change the destination of error logs by specifying the location in the –log-error option (i.e., –log-error=”G:/TMP/mysql_logs/mysql_error.err” or –log-error=/var/log/mysql/error.log).
How to change the root password for MySQL?
To change the root password in MySQL:
- ~/mysql-pwd
- Stop MYSQL withsudo systemctl stop mysqlcommand and then issue the command:sudo mysqld -init-file=~/mysql-pwd. As the command prompt returns, restart the MYSQL using thesudo systemctl start mysql
How to recover the root password for MySQL?
To recover the root password in MySQL:
- sudo service mysql stopcommand to stop the MYSQL server.
- mysql -u root
mysql> use mysql;
mysql> update user set authentication_string=password(‘NEWPASSWORD’) where user=’root’;
mysql> flush privileges;
mysql> quit
Note: In the above commands, NEWPASSWORD is the new password to be used.
- Restart the MYSQL daemon usingsudo service mysql restartand log in with the new password.
Project Setup
Create a new project directory along with a new Django project:
$ mkdir django-on-docker django-on-docker
$ mkdir app app
$ python3.9 -m venv env
$ env/bin/activate
env$
env$ pip install .2.6
env$ django-admin.py startproject hello_django .
env$ python manage.py migrate
env$ python manage.py runserverNavigate to http://localhost:8000/ to view the Django welcome screen. Kill the server once done. Then, exit from and remove the virtual environment. We now have a simple Django project to work with.
Create a requirements.txt file in the «app» directory and add Django as a dependency:
Since we’ll be moving to Postgres, go ahead and remove the db.sqlite3 file from the «app» directory.
Your project directory should look like:
└── app ├── hello_django │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── requirements.txtDocker
Install Docker, if you don’t already have it, then add a Dockerfile to the «app» directory:
# pull official base image # set work directory # set environment variables PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED # install dependencies pip install --upgrade pip ./requirements.txt . pip install -r requirements.txt# copy project . .So, we started with an Alpine-based Docker image for Python 3.9.6. We then set a working directory along with two environment variables:
PYTHONDONTWRITEBYTECODE: Prevents Python from writing pyc files to disc (equivalent topython -Boption)PYTHONUNBUFFERED: Prevents Python from buffering stdout and stderr (equivalent topython -uoption)
Finally, we updated Pip, copied over the requirements.txt file, installed the dependencies, and copied over the Django project itself.
Next, add a docker-compose.yml file to the project root:
python manage.py runserver 0.0.0.0:8000 Review the Compose file reference for info on how this file works.
Update the SECRET_KEY, DEBUG, and ALLOWED_HOSTS variables in settings.py:
# 'DJANGO_ALLOWED_HOSTS' should be a single string of hosts with a space between each. Make sure to add the import to the top:
Then, create a .env.dev file in the project root to store environment variables for development:
DEBUG=1
SECRET_KEY=foo
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]Build the image:
Once the image is built, run the container:
Navigate to http://localhost:8000/ to again view the welcome screen.
Check for errors in the logs if this doesn’t work via docker-compose logs -f.
To configure Postgres, we’ll need to add a new service to the docker-compose.yml file, update the Django settings, and install Psycopg2.
First, add a new service called db to docker-compose.yml:
python manage.py runserver 0.0.0.0:8000 To persist the data beyond the life of the container we configured a volume. This config will bind postgres_data to the «/var/lib/postgresql/data/» directory in the container.
We also added an environment key to define a name for the default database and set a username and password.
We’ll need some new environment variables for the web service as well, so update .env.dev like so:
DEBUG=1
SECRET_KEY=foo
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=hello_django_dev
SQL_USER=hello_django
SQL_PASSWORD=hello_django
SQL_HOST=db
SQL_PORT=5432Update the DATABASES dict in settings.py:
Here, the database is configured based on the environment variables that we just defined. Take note of the default values.
Update the Dockerfile to install the appropriate packages required for Psycopg2:
# pull official base image # set work directory # set environment variables PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED # install psycopg2 dependencies apk update apk add postgresql-dev gcc python3-dev musl-dev# install dependencies pip install --upgrade pip ./requirements.txt . pip install -r requirements.txt# copy project . .Add Psycopg2 to requirements.txt:
Django==3.2.6
psycopg2-binary==2.9.1Build the new image and spin up the two containers:
$ docker-compose up -d --buildRun the migrations:
$ docker-compose web python manage.py migrate --noinputdjango.db.utils.OperationalError: FATAL: database does not existRun docker-compose down -v to remove the volumes along with the containers. Then, re-build the images, run the containers, and apply the migrations.
Ensure the default Django tables were created:
$ docker-compose db psql --usernamehello_django --dbnamehello_django_dev
psql .0
Type help. List of databases Name Owner Encoding Collate Ctype Access privileges
------------------+--------------+----------+------------+------------+------------------------------- hello_django_dev hello_django UTF8 en_US.utf8 en_US.utf8 postgres hello_django UTF8 en_US.utf8 en_US.utf8 template0 hello_django UTF8 en_US.utf8 en_US.utf8 c/hello_django + CTc/hello_django template1 hello_django UTF8 en_US.utf8 en_US.utf8 c/hello_django + CTc/hello_django rows# \c hello_django_devYou are now connected to database as user . List of relations Schema Name Type Owner
--------+----------------------------+-------+-------------- public auth_group table hello_django public auth_group_permissions table hello_django public auth_permission table hello_django public auth_user table hello_django public auth_user_groups table hello_django public auth_user_user_permissions table hello_django public django_admin_log table hello_django public django_content_type table hello_django public django_migrations table hello_django public django_session table hello_django rowsYou can check that the volume was created as well by running:
$ docker volume inspect django-on-docker_postgres_dataYou should see something similar to:
: , : , : : , : , : , : , : , : null, : Next, add an entrypoint.sh file to the «app» directory to verify that Postgres is healthy before applying the migrations and running the Django development server:
! nc -z sleep .1
python manage.py flush --no-input
python manage.py migrate Update the file permissions locally:
$ chmod +x app/entrypoint.shThen, update the Dockerfile to copy over the entrypoint.sh file and run it as the Docker entrypoint command:
# pull official base image # set work directory # set environment variables PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED # install psycopg2 dependencies apk update apk add postgresql-dev gcc python3-dev musl-dev# install dependencies pip install --upgrade pip ./requirements.txt . pip install -r requirements.txt# copy entrypoint.sh ./entrypoint.sh . sed -i /usr/src/app/entrypoint.sh chmod +x /usr/src/app/entrypoint.sh# copy project . .# run entrypoint.sh Add the DATABASE environment variable to .env.dev:
DEBUG=1
SECRET_KEY=foo
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=hello_django_dev
SQL_USER=hello_django
SQL_PASSWORD=hello_django
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgresTest it out again:
- Re-build the images
- Run the containers
- Try http://localhost:8000/
Notes
First, despite adding Postgres, we can still create an independent Docker image for Django as long as the DATABASE environment variable is not set to postgres. To test, build a new image and then run a new container:
$ docker build -f ./app/Dockerfile -t hello_django:latest ./app
$ docker run -d -p :8000 -e -e -e hello_django python /usr/src/app/manage.py runserver .0.0.0:8000You should be able to view the welcome page at http://localhost:8006
Second, you may want to comment out the database flush and migrate commands in the entrypoint.sh script so they don’t run on every container start or re-start:
! nc -z sleep .1 # python manage.py flush --no-input# python manage.py migrate Instead, you can run them manually, after the containers spin up, like so:
$ docker-compose web python manage.py flush --no-input
$ docker-compose web python manage.py migrateGunicorn
Moving along, for production environments, let’s add Gunicorn, a production-grade WSGI server, to the requirements file:
Django==3.2.6
gunicorn==20.1.0
psycopg2-binary==2.9.1Curious about WSGI and Gunicorn? Review the WSGI chapter from the Building Your Own Python Web Framework course.
Since we still want to use Django’s built-in server in development, create a new compose file called docker-compose.prod.yml for production:
gunicorn hello_django.wsgi:application --bind 0.0.0.0:8000 If you have multiple environments, you may want to look at using a docker-compose.override.yml configuration file. With this approach, you’d add your base config to a docker-compose.yml file and then use a docker-compose.override.yml file to override those config settings based on the environment.
Take note of the default command. We’re running Gunicorn rather than the Django development server. We also removed the volume from the web service since we don’t need it in production. Finally, we’re using separate environment variable files to define environment variables for both services that will be passed to the container at runtime.
.env.prod:
DEBUG=0
SECRET_KEY=change_me
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=hello_django_prod
SQL_USER=hello_django
SQL_PASSWORD=hello_django
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres.env.prod.db:
POSTGRES_USER=hello_django
POSTGRES_PASSWORD=hello_django
POSTGRES_DB=hello_django_prodAdd the two files to the project root. You’ll probably want to keep them out of version control, so add them to a .gitignore file.
Bring down the development containers (and the associated volumes with the -v flag):
Then, build the production images and spin up the containers:
$ docker-compose -f docker-compose.prod.yml up -d --buildVerify that the hello_django_prod database was created along with the default Django tables. Test out the admin page at http://localhost:8000/admin. The static files are not being loaded anymore. This is expected since Debug mode is off. We’ll fix this shortly.
Again, if the container fails to start, check for errors in the logs via docker-compose -f docker-compose.prod.yml logs -f.
Production Dockerfile
Did you notice that we’re still running the database flush (which clears out the database) and migrate commands every time the container is run? This is fine in development, but let’s create a new entrypoint file for production.
entrypoint.prod.sh:
! nc -z sleep .1 Update the file permissions locally:
$ chmod +x app/entrypoint.prod.shTo use this file, create a new Dockerfile called Dockerfile.prod for use with production builds:
# BUILDER ## pull official base image # set work directory # set environment variables PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED # install psycopg2 dependencies apk update apk add postgresql-dev gcc python3-dev musl-dev pip install --upgrade pip pip install .9.2 . . flake8 --ignoreE501,F401 .# install dependencies ./requirements.txt . pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt# FINAL ## pull official base image mkdir -p /home/app addgroup -S app adduser -S app -G app# create the appropriate directories /home/app /home/app/web mkdir # install dependencies apk update apk add libpq --frombuilder /usr/src/app/wheels /wheels --frombuilder /usr/src/app/requirements.txt . pip install --no-cache /wheels/*# copy entrypoint.prod.sh ./entrypoint.prod.sh . sed -i /entrypoint.prod.sh chmod +x /entrypoint.prod.sh# copy project . chown -R app:app # run entrypoint.prod.sh Here, we used a Docker multi-stage build to reduce the final image size. Essentially, builder is a temporary image that’s used for building the Python wheels. The wheels are then copied over to the final production image and the builder image is discarded.
You could take the multi-stage build approach a step further and use a single Dockerfile instead of creating two Dockerfiles. Think of the pros and cons of using this approach over two different files.
Did you notice that we created a non-root user? By default, Docker runs container processes as root inside of a container. This is a bad practice since attackers can gain root access to the Docker host if they manage to break out of the container. If you’re root in the container, you’ll be root on the host.
Update the web service within the docker-compose.prod.yml file to build with Dockerfile.prod:
gunicorn hello_django.wsgi:application --bind 0.0.0.0:8000 Try it out:
$ docker-compose -f docker-compose.prod.yml down -v
$ docker-compose -f docker-compose.prod.yml up -d --build
$ docker-compose -f docker-compose.prod.yml web python manage.py migrate --noinputNginx
Next, let’s add Nginx into the mix to act as a reverse proxy for Gunicorn to handle client requests as well as serve up static files.
Add the service to docker-compose.prod.yml:
Then, in the local project root, create the following files and folders:
└── nginx ├── Dockerfile └── nginx.confDockerfile:
rm /etc/nginx/conf.d/default.conf nginx.conf /etc/nginx/conf.dnginx.conf:
upstream hello_django server web:8000
server listen location / proxy_pass http://hello_django proxy_set_header X-Forwarded-For proxy_set_header Host proxy_redirect off Then, update the web service, in docker-compose.prod.yml, replacing ports with expose:
gunicorn hello_django.wsgi:application --bind 0.0.0.0:8000 Now, port 8000 is only exposed internally, to other Docker services. The port will no longer be published to the host machine.
Test it out again.
$ docker-compose -f docker-compose.prod.yml down -v
$ docker-compose -f docker-compose.prod.yml up -d --build
$ docker-compose -f docker-compose.prod.yml web python manage.py migrate --noinputEnsure the app is up and running at http://localhost:1337.
Your project structure should now look like:
├── .env.dev
├── .env.prod
├── .env.prod.db
├── .gitignore
├── app
│ ├── Dockerfile
│ ├── Dockerfile.prod
│ ├── entrypoint.prod.sh
│ ├── entrypoint.sh
│ ├── hello_django
│ │ ├── __init__.py
│ │ ├── asgi.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── manage.py
│ └── requirements.txt
├── docker-compose.prod.yml
├── docker-compose.yml
└── nginx ├── Dockerfile └── nginx.confBring the containers down once done:
$ docker-compose -f docker-compose.prod.yml down -vSince Gunicorn is an application server, it will not serve up static files. So, how should both static and media files be handled in this particular configuration?
Static Files
Update settings.py:
BASE_DIR / Development
Now, any request to http://localhost:8000/static/* will be served from the «staticfiles» directory.
To test, first re-build the images and spin up the new containers per usual. Ensure static files are still being served correctly at http://localhost:8000/admin.
Production
For production, add a volume to the web and nginx services in docker-compose.prod.yml so that each container will share a directory named «staticfiles»:
gunicorn hello_django.wsgi:application --bind 0.0.0.0:8000 We need to also create the «/home/app/web/staticfiles» folder in Dockerfile.prod:
...# create the appropriate directories /home/app /home/app/web mkdir mkdir /staticfiles ...Why is this necessary?
Docker Compose normally mounts named volumes as root. And since we’re using a non-root user, we’ll get a permission denied error when the collectstatic command is run if the directory does not already exist
To get around this, you can either:
- Create the folder in the Dockerfile (source)
- Change the permissions of the directory after it’s mounted (source)
We used the former.
Next, update the Nginx configuration to route static file requests to the «staticfiles» folder:
upstream hello_django server web:8000
server listen location / proxy_pass http://hello_django proxy_set_header X-Forwarded-For proxy_set_header Host proxy_redirect off location /static/ /home/app/web/staticfiles/ Spin down the development containers:
Test:
$ docker-compose -f docker-compose.prod.yml up -d --build
$ docker-compose -f docker-compose.prod.yml web python manage.py migrate --noinput
$ docker-compose -f docker-compose.prod.yml web python manage.py collectstatic --no-input --clearAgain, requests to http://localhost:1337/static/* will be served from the «staticfiles» directory.
Navigate to http://localhost:1337/admin and ensure the static assets load correctly.
You can also verify in the logs — via docker-compose -f docker-compose.prod.yml logs -f — that requests to the static files are served up successfully via Nginx:
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
nginx_1 .168.144.1 - - /Aug/2021:20:11:00 +0000 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" Bring the containers once done:
$ docker-compose -f docker-compose.prod.yml down -vTo test out the handling of media files, start by creating a new Django app:
$ docker-compose up -d --build
$ docker-compose web python manage.py startapp uploadAdd the new app to the INSTALLED_APPS list in settings.py:
app/upload/views.py:
Add a «templates», directory to the «app/upload» directory, and then add a new template called upload.html:
{% block content %} {% csrf_token %} {% if image_url %} File uploaded at: {{ image_url }} {% endif %}
{% endblock %}app/hello_django/urls.py:
app/hello_django/settings.py:
Development
Test:
$ docker-compose up -d --buildYou should be able to upload an image at http://localhost:8000/, and then view the image at http://localhost:8000/media/IMAGE_FILE_NAME.
Production
For production, add another volume to the web and nginx services:
gunicorn hello_django.wsgi:application --bind 0.0.0.0:8000 Create the «/home/app/web/mediafiles» folder in Dockerfile.prod:
...# create the appropriate directories /home/app /home/app/web mkdir mkdir /staticfiles mkdir /mediafiles ...Update the Nginx config again:
upstream hello_django server web:8000
server listen location / proxy_pass http://hello_django proxy_set_header X-Forwarded-For proxy_set_header Host proxy_redirect off location /static/ /home/app/web/staticfiles/ location /media/ /home/app/web/mediafiles/ Re-build:
$ docker-compose down -v
$ docker-compose -f docker-compose.prod.yml up -d --build
$ docker-compose -f docker-compose.prod.yml web python manage.py migrate --noinput
$ docker-compose -f docker-compose.prod.yml web python manage.py collectstatic --no-input --clearTest it out one final time:
- Upload an image at http://localhost:1337/.
- Then, view the image at http://localhost:1337/media/IMAGE_FILE_NAME.
If you see an 413 Request Entity Too Large error, you’ll need to increase the maximum allowed size of the client request body in either the server or location context within the Nginx config.
location / proxy_pass http://hello_django proxy_set_header X-Forwarded-For proxy_set_header Host proxy_redirect off client_max_body_size 100M
Objectives
By the end of this tutorial, you should be able to:
- Explain what Vault is and why you may want to use it
- Describe the basic Vault architecture along with dynamic and static secrets, the various backends (storage, secret, auth, audit), and how Vault can be used as an «encryption as a service»
- Configure and run Vault and Consul with Docker
- Spin up Vault with the Filesystem backend
- Init and unseal Vault
- Authenticate against Vault
- Configure an Audit backend to log all interactions with Vault
- Work with static and dynamic secrets via the CLI, HTTP API, and UI
- Create a Vault policy to limit access to a specific path
- Use the Transit backend as an «encryption as a service»
- Set up Consul to work with Vault as Storage backend for secrets
- Define a custom lease period for a secret and revoke a secret before the end of that period
What is Vault?
Vault is an open-source tool used for securely storing and managing secrets.
Take a moment to think about how your team currently manages and distributes secrets:
- Who has access to them?
- Who manages them?
- How do you control who has access to them?
- How do your apps get them?
- How are they updated?
- How are they revoked?
Vault provides answers to those questions and helps to solve the following problems with regard to secret management:
| Problems | Vault’s Goals |
|---|---|
| Secrets are everywhere. | Vault is the single source of truth for all secrets. |
| They are generally unencrypted. | Vault manages encryption (during transit and at rest) out of the box. |
| It’s difficult to dynamically generate them. | Secrets can be dynamically generated. |
| It’s even more difficult to lease and revoke them. | Secrets can be leased and revoked. |
| There’s no audit trail. | There’s an audit trail for generating and using secrets. |
Vault has a number of moving pieces so it can take some time to get up to speed with the overall architecture. Take a moment to review the Architecture guide, taking note of the following backends:
| Backend | Use | Examples |
|---|---|---|
| Storage | Where secrets are stored | Consul*, Filesystem*, In-Memory, PostgreSQL, S3 |
| Secret | Handles static or dynamic secrets | AWS*, Databases, Key/Value*, RabbitMQ, SSH |
| Auth | Handles authentication and authorization | AWS, Azure, Google Cloud, GitHub, Tokens*, Username & Password |
| Audit | Logs all requests and responses | File*, Syslog, Socket |
* used in this tutorial
With that, let’s start using Vault.
Auditing
Before we test out the functionality, let’s enable an Audit Device:
bash-5.1# vault audit file /vault/logs/audit.log
Success! Enabled the file audit device at: file/You should now be able to view the logs locally in «vault/logs». To test, run the following command to view all enabled Audit Devices:
bash-5.1# vault audit list
Path Type Description
---- ---- -----------
file/ file n/aThe request and subsequent response should be logged in vault/logs/audit.log. Take a look.
There are two types of secrets in Vault: static and dynamic.
Dynamic secrets are generated on demand. They have enforced leases and generally expire after a short period of time. Since they do not exist until they are accessed, there’s less exposure — so dynamic secrets are much more secure. Vault ships with a number of dynamic backends — i.e., AWS, Databases, Google Cloud, Consul, and RabbitMQ.
Static Secrets
Vault can be managed through the CLI, HTTP API, or UI.
CLI
Still within the bash session in the container, we can create, read, update, and delete secrets. We’ll also look at how to version and roll back secrets.
Enable secrets with following command:
bash-5.1# vault secrets kv
Success! Enabled the kv secrets engine at: kv/Create a new secret with a key of bar and value of precious within the kv/foo path:
bash-5.1# vault kv put kv/foo precious
Success! Data written to: kv/fooRead:
bash-5.1# vault kv get kv/foo
Key Value
--- -----
bar preciousTo work with different versions of a specific key, we’ll need to upgrade to v2 of the Key/Value backend:
bash-5.1# vault kv enable-versioning kv/
Success! Tuned the secrets engine at: kv/Add version 2 by updating the value to copper:
bash-5.1# vault kv put kv/foo copper
Key Value
--- -----
created_time -09-08T18:23:14.4154928Z
deletion_time n/a
destroyed
version Read version 1:
bash-5.1# vault kv get -version kv/foo
Key Value
--- -----
created_time -09-08T18:22:37.2548824Z
deletion_time n/a
destroyed
version
Key Value
--- -----
bar preciousRead version 2:
bash-5.1# vault kv get -version kv/foo
Key Value
--- -----
created_time -09-08T18:23:14.4154928Z
deletion_time n/a
destroyed
version
Key Value
--- -----
bar copperDelete the latest version (e.g., version 2):
bash-5.1# vault kv delete kv/foo
Success! Data deleted it existed at: kv/fooDelete version 1:
bash-5.1# vault kv delete -versions kv/foo
Success! Data deleted it existed at: kv/fooYou can undelete as well:
bash-5.1# vault kv undelete -versions kv/foo
Success! Data written to: kv/undelete/fooDelete is akin to a soft delete. If you want to remove the underlying metadata, you’ll have to use the destroy command:
bash-5.1# vault kv destroy -versions kv/foo
Success! Data written to: kv/destroy/fooReview v1 and v2 to view all the available commands.
Take note of the audit log. Each of the above requests were logged!
API
You can also interact with Vault via the HTTP API. We’ll make requests against v2 of the API. Open a new terminal tab, and then set the root token as an environment variable:
$ your_token_goes_hereCreate a new secret called foo with a value of world:
$ curl -H -H -X POST -d http://127.0.0.1:8200/v1/kv/data/helloRead the secret:
$ curl -H -X GET http://127.0.0.1:8200/v1/kv/data/helloThe JSON response should contain a data key with a value similar to:
: : : , : : , : , : false, : 
Try adding new versions, deleting, and destroying on your own.
The UI should be up at running at http://localhost:8200/ui/vault. Use the root token to login. Then, explore the Key/Value backend on your own:

Policies
Thus far we’ve been using the root policy to interact with the API. Let’s set up a policy that only has read access.
Add a new config file called app-policy.json to «vault/policies»:
Create a new policy back in the bash session:
bash-5.1# vault policy write app /vault/policies/app-policy.json
Success! Uploaded policy: appThen, create a new token:
bash-5.1# vault token create -policyapp
Key Value
--- -----
token s.ZOUMx3RIhVRhI4ijlZg8KXRQ
token_accessor TT53xOxbIfGjI7l4392gjXcg
token_duration 768h
token_renewable
token_policies
identity_policies
policies Within another new terminal tab (you should now have three), add the VAULT_TOKEN environment variable with the new token:
$ your_token_goes_hereTry to read the foo secret that we previously set:
$ curl -H -X GET http://127.0.0.1:8200/v1/kv/data/helloYou should not have the correct permissions to view that secret:
: "1 error occurred:\n\t* permission denied\n\n" Why can’t we even read it? Jump back to the policy config in vault-config.json. kv/data/app/* indicates that the policy can only read from the app path.
As you’ve probably already noticed, nearly everything in Vault is path-based.
Back within the bash session in the container, add a new secret to the app/test path:
bash-5.1# vault kv put kv/app/test pong
Key Value
--- -----
created_time -09-08T18:40:35.2694047Z
deletion_time n/a
destroyed
version You should be able to view the secret using the token associated with the app policy:
$ curl -H -X GET http://127.0.0.1:8200/v1/kv/data/app/testPolicies can be managed from the UI as well:

Encryption as a Service
Before we look at dynamic secrets, let’s quickly review the Transit backend, which can be used as an «encryption as a service» for:
- Encrypting and decrypting data «in-transit» without storing it inside Vault
- Easily integrating encryption into your application workflow
Back within the bash session in the container, enable Transit:
bash-5.1# vault secrets transit
Success! Enabled the transit secrets engine at: transit/Configure a named encryption key:
bash-5.1# vault write -f transit/keys/foo
Success! Data written to: transit/keys/fooEncrypt:
bash-5.1# vault write transit/encrypt/foo base64
Key Value
--- -----
ciphertext vault:v1:cFnk5AQLE9Mg+mZ7Ej17vRmYT5aqheikdZQ1FC4vre5jAod0L/uHDADecrypt:
bash-5.1# vault write transit/decrypt/foo vault:v1:cFnk5AQLE9Mg+mZ7Ej17vRmYT5aqheikdZQ1FC4vre5jAod0L/uHDA
Key Value
--- -----
plaintext bXkgcHJlY2lvdXMKDecode:
bash-5.1# base64 -d
my preciousTest it out in the UI as well:

Dynamic Secrets
As mentioned, Vault supports a number of dynamic secret backends for generating secrets dynamically when needed. For example, with the AWS and Google Cloud backends, you can create access credentials based on IAM policies. The Databases backend, meanwhile, generates database credentials based on configured roles.
Dynamic Secrets:
- are generated on demand
- have limited access based on role
- are leased for a period of time
- can be revoked
- come with an audit trail
Let’s look at how to generate AWS credentials using the AWS backend.
AWS Credentials
Enable the AWS secrets backend:
bash-5.1# vault secrets -pathaws aws
Success! Enabled the aws secrets engine at: aws/Authenticate:
bash-5.1# vault write aws/config/root foo bar
Success! Data written to: aws/config/rootMake sure to replace foo and bar with your AWS access key id and secret key, respectively.
Create role:
bash-5.1# vault write aws/roles/ec2-read iam_user -
Success! Data written to: aws/roles/ec2-readHere, we created a new role based on AmazonEC2ReadOnlyAccess, which is an AWS-managed policy. As the name suggests, it give users read-only access to the EC2 console; they cannot perform any actions or create new resources. You can also use an inline policy to create a custom role based on your individual needs. We’ll look at an example of this shortly. Refer to the AWS Secrets Engine docs for more info.
Remember: Dynamic Secrets are generated only when they are requested (i.e., a web app requests access to S3). They are not available in the store before this.
Create a new set of credentials:
bash-5.1# vault aws/creds/ec2-read
Key Value
--- -----
lease_id aws/creds/ec2-read/9KdO6J7KVBiSwOPEvwrqqALG
lease_duration 768h
lease_renewable
access_key AKIAZ4DZAKZKEULSDW5A
secret_key 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
security_token <nil>You should now be able to see the user within the «Users» section on the IAM console on AWS:

Leases and Revocation
In this section, we’ll take a quick look at how to define a custom lease period and revoke a secret before the end of that period.
Create a new AWS role:
bash-5.1# vault write aws/roles/foo iam_user -
Success! Data written to: aws/roles/fooTake note of the lease_duration when you create a new AWS credential:
bash-5.1# vault aws/creds/foo
Key Value
--- -----
lease_id aws/creds/foo/F0oBbnBIHEoz0ywVVtbuJB7r
lease_duration 768h
lease_renewable
access_key AKIAZ4DZAKZKLJKB7CPX
secret_key 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
security_token <nil>What if you only wanted the lease period for all AWS IAM dynamic secrets to be 30 minutes?
bash-5.1# vault write aws/config/lease 1800s 1800sIn this example, since lease_max is the same as lease, you won’t be able to renew the token. If you set the lease_max to 3600s, you’d be able to renew the lease once. For more, review the Tokens and Leases guide.
Create a new credential:
bash-5.1# vault aws/creds/foo
Key Value
--- -----
lease_id aws/creds/foo/xQlJpKDS1ljE9Awz0aywXgbB
lease_duration 30m
lease_renewable
access_key AKIAZ4DZAKZKJPL5OM5W
secret_key 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
security_token <nil>Want to quickly revoke this credential? Grab the lease_id and then run:
bash-5.1# vault lease revoke aws/creds/foo/xQlJpKDS1ljE9Awz0aywXgbBWant to revoke all AWS creds?
bash-5.1# vault lease revoke -prefix aws/Refer to the Lease, Renew, and Revoke guide for more info these concepts.
Access denied for user ‘[email protected]’ (using password
I’m new to MySQL, I’m trying to run WordPress in my Windows desktop and it needs MySQL.
I install everything with Web Platform Installer which is provided by Microsoft. I never set a root password for MySQL and in the final step of installing WordPress, it asks for a MySQL server password.
What is the default password for root (if there is one) and how to change it?
I tried:
mysql -u root password '123'But it shows me:
Access denied for user '[email protected]' (using password:NO)After this I try:
mysql -u root -pHowever, it asks for a password which I don’t have.
Update: as Bozho suggested, I did the following:
- I stopped the MySQL Service from Windows services
- Opened CMD
- Changed the location to c:\program files\mysql\bin
Executed the command below
mysqld —defaults-file=»C:\\program files\\mysql\\mysql server 5.1\\my.ini» —init-files=C:\\root.txt
The command ran with a warning about character set which I mentioned below
- I start the MySQL service from Windows services
I write in the command line
mysql -u root -p
EnterPassword: 123 // 123 was the password
How do I solve this? I’m waiting to hear from you.
Solutions
You can reset your root password. Have in mind that it is not advisable to use root without password.
for this kind of error; you just have to set new password to the root user as an admin. follow the steps as follows:
[root ~]# mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:NO)Stop the service/daemon of mysql running
[root ~]# service mysql stop mysql stop/waiting
At this moment, the terminal will seem to halt. Let that be, and use new terminal for next steps.
mysql> use mysql; Database changed mysql> select * from user; Empty set (0.00 sec) mysql> truncate table user; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) mysql> grant all privileges on *.* to [email protected] identified by 'YourNewPassword' with grant option; Query OK, 0 rows affected (0.01 sec)
*if you don`t want any password or rather an empty password
mysql> grant all privileges on *.* to [email protected] identified by '' with grant option; Query OK, 0 rows affected (0.01 sec)* mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)Confirm the results:
mysql> select host, user from user;
+-----------+------+
| host | user |
+-----------+------+
| localhost | root |
+-----------+------+
1 row in set (0.00 sec)[root ~]# mysql -u root -pYourNewPassword mysql>
1) You can set root password by invoking MySQL console. It is located in
C:\wamp\bin\mysql\mysql5.1.53\bin by default.
Get to the directory and type MySQL. then set the password as follows..
> SET PASSWORD FOR [email protected] = PASSWORD('new-password');2) You can configure wamp’s phpmyadmin application for root user by editing
C:\wamp\apps\phpmyadmin3.3.9\config.inc.php Note :- if you are using xampp then , file will be located at
C:\xampp\phpMyadmin\config.inc.phpIt looks like this:
$cfg['Servers'][$i]['verbose'] = 'localhost'; $cfg['Servers'][$i]['host'] = 'localhost'; $cfg['Servers'][$i]['port'] = ''; $cfg['Servers'][$i]['socket'] = ''; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['extension'] = 'mysqli'; $cfg['Servers'][$i]['auth_type'] = 'config'; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = 'YOURPASSWORD'; $cfg['Servers'][$i]['AllowNoPassword'] = false;The error «Access denied for user ‘[email protected]‘ (using password:NO)»
will be resolved when you set $cfg['Servers'][$i]['AllowNoPassword'] to false
If you priviously changed the password for ‘[email protected]‘, then you have to do 2 things to solve the error «Access denided for user ‘[email protected]‘»:
- if [‘password’] have a empty quotes like ‘ ‘ then put your password between quotes.
- change the (using password:NO) to (using password:YES)
This will resolve the error.
Note: phpmyadmin is a separate tool which comes with wamp.
It just provide a interface to MySQL. if you change my sql root’s password, then you should change the phpmyadmin configurations. Usually phpmyadmin is configured to root user.
Similar questions
mysql_query(): Access denied for user »@’localhost’ (using password: NO)
I’m running a cron job in my WordPress site and getting these two errors Warning: mysql_query(): A link to the server could not be established in /home/geekda6/public_html/wp-content/plugins/maxblogpress-ninja-affiliate/ninja-affiliate-library/include/mbp-ninja-affiliate.cls.php on line 251 Warning: mysql_query(): Access denied for user »@’localho…
Access denied for user »@’localhost’ (using password: NO) When Upgrading WordPress
I just tried to upgrade the latest wordpress version, and it throws this error. Access denied for user »@’localhost’ (using password: NO) . I immediately communicated it to the service provider, they say it is a database error. But i checked the wp-config file with correct database name, username and password, It is all perfect. But why still im g…
How do I reset my localhost MySQL password?
In the mysql client, tell the server to reload the grant tables so that account-management statements work: mysql>, FLUSH PRIVILEGES, Then change the ‘root’@’localhost’ account password . Replace the password with the password that you want to use
What is default MySQL root password?
The default user for MySQL is root and by default it has no password
What is the default root password for MySQL in ubuntu?
In MySQL, by default, the username is root and there’s no password . If during the installation process, you accidentally put a password in and don’t remember, here is how to reset the password: Stop the MySQL server if it is running, then restart it with the –skip-grant-tables option
How do I change the root password in MySQL 8?
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’, In the above change “new_password” with the password that you wish to use. This will start the MySQL service and during the process it will execute the init-file that you have created and thus the password for the root user will be updated






