Завершите доступ к базе после окончания отчёта

PostgreSQLBeginner
Практиковаться сейчас

Введение

Расчётному отчёту нужен доступ к базе во время выполнения. После завершения задания сохранённые учётные данные должны перестать открывать новые соединения. Сообщения о принятии запроса сервисом секретов недостаточно, чтобы подтвердить этот результат.

Эта независимая среда MarketLedger начинается с правильных прав на представление. Вы выполните отчёт, отзовёте его точную аренду OpenBao, понаблюдаете естественное истечение отдельной аренды и восстановите работу, получив новый логин. Магазин и независимый отчёт инвентаризации должны остаться работоспособными. В предыдущем занятии вы изучили поля учётных данных и ограниченную политику отчёта; файлы и состояние сеанса оттуда не переносятся.

Начните с работающего магазина и правильной политики отчёта

На этом шаге вы определите обычные бизнес-процессы и две роли отчёта, прежде чем запустить отсчёт любой аренды. Всегда используйте Terminal. Перейдите в независимый рабочий каталог:

cd /home/labex/project/market-report

cat выводит подготовленный рабочий пример:

cat demo.tsv

Расчёт охватывает 2026-10-28: у Birch два оплаченных заказа на 4700 центов, у Elm один на 2000, у Maple один на 2700. Отменённый заказ исключён. Отчёт использует reporting.daily_settlement; приватные адреса электронной почты клиентов и банковские реквизиты вне его области.

Подготовленный клиент магазина обращается к настоящему сервису магазина. Его аргументы определяют новый заказ, продавца и сумму в центах. Создайте обычный заказ для следующей учебной торговой даты, 2026-10-29:

python3 shop.py place --order O201 --vendor V101 --cents 600

Этот более поздний заказ не входит во вчерашний расчёт. При повторении команды сервис отклонит дубликат; используйте python3 shop.py list, чтобы увидеть существующий заказ, вместо его удаления.

Предоставленный env.sh содержит локальные адреса сервисов и читает ограниченный токен оператора из закрытого файла. source загружает присваивания в текущую оболочку; export делает их доступными дочерним командам. В новом терминале их надо загрузить снова:

source env.sh

Токен оператора разрешает запросы OpenBao; это не пароль базы данных. Этот токен может получать и отзывать точные аренды ролей settlement-report и settlement-short. Он не может управлять независимым отчётом инвентаризации или читать административное соединение базы.

Прочитайте правильные инструкции создания учётных записей:

cat role.sql

Они создают сгенерированный логин с переданным сроком действия пароля, дают поиск в схеме и чтение расчётного представления и сохраняют встроенный аудит SQL. Не меняйте эти инструкции и конфигурации обеих ролей в этом занятии.

Обычная роль отчёта по умолчанию действует десять минут. Отдельная подготовленная роль settlement-short действует тридцать секунд и имеет те же права на представление. Ни один отсчёт не начинается до запроса учётных данных. Вам не придётся спешить по уроку до истечения учётных данных, созданных при подготовке.

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

При опечатке в пути вернитесь приведённой выше абсолютной командой cd, выполните ls и повторите команду с фактическим именем файла. Это восстановление работает без сброса среды.

Выполните расчёт с новым временным логином

На этом шаге вы создадите настоящий отчёт, прежде чем завершать доступ задания. Оставайтесь в Terminal с загруженным env.sh.

umask 077 делает вновь создаваемые файлы доступными для чтения и записи только вашей учётной записи; другие учётные записи не получают к ним доступа. bao read -format=json запрашивает настоящие динамические учётные данные и выдаёт JSON; > сохраняет их в файл вместо вывода пароля. Эта выдача запускает десятиминутный отсчёт аренды:

umask 077
bao read -format=json database/creds/settlement-report > lease.json

jq выбирает поля JSON. Прочитайте несекретные ID аренды, длительность и сгенерированное имя пользователя базы:

jq '.lease_id, .lease_duration, .data.username' lease.json

ID аренды обозначает эту выдачу в OpenBao; имя пользователя обозначает её логин PostgreSQL. Ни то ни другое не является токеном оператора. Не перезаписывайте этот ответ только для повторного изучения: при прекращении доступа вам понадобится точный ID аренды.

Параметр -r убирает кавычки JSON. Подстановки команд в кавычках загружают сгенерированные имя и пароль в среду клиента базы, не выводя пароль:

export PGUSER="$(jq -r .data.username lease.json)"
export PGPASSWORD="$(jq -r .data.password lease.json)"

psql -X игнорирует персональные файлы запуска psql, -v ON_ERROR_STOP=1 останавливает работу при ошибках SQL, а -c передаёт команду SQL. Спросите настоящее соединение, какую идентичность оно использует:

psql -X -v ON_ERROR_STOP=1 -c 'SELECT current_user;'

Ожидайте новое сгенерированное имя пользователя. -f report.sql читает подготовленный запрос; > сохраняет его фактический вывод с разделением табуляцией:

psql -X -v ON_ERROR_STOP=1 -f report.sql > settlement.tsv
cat settlement.tsv

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

sudo python3 /opt/labex-report/verify.py result

Подготовленная проверка использует sudo для чтения защищённых встроенных свидетельств и испытания SQL политики в изолированной тестовой среде обычной учётной записи. Она не выдаёт ваши рабочие учётные данные и не генерирует отчёт. Копия примера без настоящего запроса отчёта под выданной идентичностью проверку не пройдёт.

Если вы читали медленно и логин истёк до выполнения отчёта, запросите замену только один раз, загрузите обе переменные базы и повторите команды определения идентичности и отчёта. Для существующей выдачи, которую вы всё ещё намерены явно завершить, сохраните её ответ под отдельным именем перед запросом другой. У каждой замены, использованной для выполнения отчёта, тоже должна быть завершена её собственная точная аренда; завершение оценивается по последнему реальному выполнению отчёта.

Отзовите точную аренду завершённого задания

На этом шаге вы завершите доступ задания отчёта и проверите новое соединение с сохранёнными старыми учётными данными. Оставайтесь в Terminal.

bao lease revoke запрашивает отзыв одной выдачи. Подстановка $(jq -r .lease_id lease.json) в кавычках передаёт полный сохранённый ID аренды. Используйте именно этот ID, а не имя пользователя базы и не префикс, содержащий другие аренды. Если десятиминутная выдача уже истекла, пока вы читали, отзыв может сообщить, что аренда больше не найдена. Для упражнения явного отзыва сохраните старый ответ, получите замену обычной роли под новым именем файла, загрузите обе переменные базы, повторите отчёт и используйте имя файла замены в команде и пробе ниже. Уже истёкшая выдача не подтверждает ваш явный отзыв:

bao lease revoke "$(jq -r .lease_id lease.json)"

CLI может сообщить, что операции отзыва поставлены в очередь. Сам по себе этот ответ не доказывает, что PostgreSQL отказал старому логину.

Подготовленная проба access.py читает сохранённые учётные данные и открывает новое TCP-соединение с парольной аутентификацией. --wait-denied 10 даёт до десяти секунд на отказ пароля. Она отличает такой отказ от недоступности базы или запрещённого SQL-запроса; остановка сервера не удовлетворяет проверке:

python3 /opt/labex-report/access.py lease.json --wait-denied 10

Ожидайте сообщение PostgreSQL password authentication failed, затем подтверждение, что эти сохранённые учётные данные не могут открыть новое соединение. Проба сообщает исходный код psql 2. Сама проба возвращает успех только после подтверждения ожидаемого отказа.

echo $? выводит код выхода непосредственно предыдущей команды. Здесь ожидайте 0: проба успешно подтвердила намеченную неудачу, а не успешное соединение psql:

echo $?

Проверьте завершённое задание:

sudo python3 /opt/labex-report/verify.py finished

Проверка требует встроенного факта успешного отзыва точной аренды, соответствующего события завершённого отзыва, последующей неудачной новой аутентификации и действительно непригодного логина PostgreSQL. Она также сохраняет полный отчёт и независимые функции магазина и отчёта. Она ничего не отзывает за вас.

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

Понаблюдайте естественное истечение отдельной аренды

На этом шаге вы отличите естественное истечение от явного отзыва. Используйте Terminal с тем же ограниченным оператором OpenBao.

Подготовленная роль settlement-short имеет TTL тридцать секунд. Вы запросите её учётные данные и немедленно проверите настоящее разрешённое чтение одной операцией, чтобы чтение следующего пояснения не тратило полезное время. && запускает пробу только при успешной выдаче учётных данных:

bao read -format=json database/creds/settlement-short > short-lease.json && python3 /opt/labex-report/access.py short-lease.json

Ожидайте сгенерированное имя пользователя, фактическое расчётное представление из трёх строк и Native psql exit: 0. Имя пользователя и ID аренды отличаются от явно отозванного задания. Проба только читает данные; она не создаёт файл отчёта и не выполняет задание отчёта за вас.

Теперь дайте аренде истечь самостоятельно. Не отзывайте и не продлевайте short-lease.json. Следующая проба многократно открывает новые соединения, ожидая до сорока секунд настоящего отказа парольной аутентификации:

python3 /opt/labex-report/access.py short-lease.json --wait-denied 40

Если до этой команды вы читали более тридцати секунд, отказ может появиться сразу. Это всё ещё естественное истечение: предыдущая совмещённая операция уже доказала, что учётные данные изначально работали. Иначе проба ждёт истечения. Как и прежде, ожидайте исходную ошибку PostgreSQL и подтверждение пробы.

Ошибка соединения с сообщением о недоступном сервере не доказывает истечения. Если первоначальная выдача или её немедленное чтение не удались, изучите ошибку до повторения совмещённой операции. Не представляйте неиспользованный неверный пароль как свидетельство истечения работавших учётных данных. Итоговая проверка требует фактического успешного чтения короткой роли, встроенного события истечения и последующего отказа аутентификации.

Отсчёт аренды начался по вашему запросу, а не при подготовке среды; ни один шаг не требует вводить команды в случайное окно запуска.

Восстановите работу с новым логином и тоже завершите его доступ

На этом шаге вы выполните более позднюю попытку отчёта после прекращения работы старых учётных данных. Оставайтесь в Terminal. Восстановление означает получение новых учётных данных через уполномоченный сервис; редактирование старого ответа не продлевает его идентичность базы.

Сохраните новую выдачу обычной роли под другим именем, чтобы оставить предыдущие свидетельства:

bao read -format=json database/creds/settlement-report > recovery-lease.json

Загрузите новую идентичность и выполните тот же настоящий отчёт:

export PGUSER="$(jq -r .data.username recovery-lease.json)"
export PGPASSWORD="$(jq -r .data.password recovery-lease.json)"
psql -X -v ON_ERROR_STOP=1 -f report.sql > settlement.tsv
cat settlement.tsv

Полный бизнес-результат не изменился. Имя пользователя базы новое — это ожидаемый путь восстановления после завершения старой выдачи.

Завершите также точную аренду этого задания замены:

bao lease revoke "$(jq -r .lease_id recovery-lease.json)"
python3 /opt/labex-report/access.py recovery-lease.json --wait-denied 10

Если вы повторяете отчёт с ещё одним логином замены, завершите и его точную аренду. Проверка завершения использует идентичность последнего настоящего выполнения отчёта, поэтому ранее отозванная учётная запись не доказывает завершения более позднего задания.

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

python3 shop.py list

Запустите итоговую проверку жизненного цикла:

sudo python3 /opt/labex-report/verify.py lifecycle

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

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

Резюме

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

Результат намеренно ограничен новыми соединениями с парольной аутентификацией в этой подготовленной среде. Он не утверждает, что завершены все уже открытые сеансы или промышленные пулы соединений. Самостоятельное задание объединяет политику прав и жизненный цикл завершённого задания для другого отчётного представления.