이번 시간에는 postgresql에서 어떻게 인증 방식을 md5에서 scram-sha-256으로 바꾸는지 보도록 하겠습니다. 12버전에서 테스트 하였습니다.

 


 

 먼저, 유저 gh를 생성하고, LOGIN이 가능하게 하겠습니다.

 

 그럴려면, gh라는 role을 생성하고 LOGIN 권한을 주면 됩니다. 다음에, password를 설정하려면, alter role ~ with password ~ 요렇게 입력하시면 됩니다. 다음에 du를 입력해 보시면, Role name이 쭉 뜨는 것을 알 수 있습니다.

 

 여기서, postgres는 Superuser이면서 role도 create 할 수 있고, DB도 만들 수 있고 그런 걸로 보아서는 전지 전능한 존재인 듯 합니다. 털리면 안 될 듯 합니다?

 

 cho로 로그인을 한 상태에서 psql -U gh를 입력해 보았습니다. 그랬더니, Peer authentication failed라고 떴습니다. 인증 방식 때문에 로그인이 안 된 것으로 보이네요.

 

 pg_hba.conf와 postgresql.conf를 찾아야 합니다. 이 둘을 적절하게 잘 설정하면 인증 방식도 바꿀 수 있고, 암호화 방식도 바꿀 수 있습니다. pg_hba.conf 먼저 보겠습니다.

 

 DATABASE USER ADDRESS METHOD 등이 있는 걸로 보아서는 각각의 연결에 대한 로그인이나 인증 방식을 설정하는 파일인 듯 합니다. 이 파일에 있는 내용을 읽어 봅시다.

 

먼저 local all postgres는 local에서 postgres는 peer 인증 방식으로 로그인을 한다는 의미입니다. postgres는 매우 중요한 유저이므로, 로그인 할 방법을 남겨둬야 합니다. 사실 건드리지 않는 것이 더 좋아 보입니다. 제가 바꾼 부분은, local all gh md5 부분입니다. 이것은 로컬에서 gh라는 유저는 md5로 인증을 한다는 의미입니다. 저는 local에서 test를 하기 위해서 저리 바꾸었습니다.

 

 이렇게까지만 바꾸고 postgresql을 재기동 해 보겠습니다.

 

 그러면, 암호를 입력하는 인증 방식이 잘 먹혀 들어갑니다. 그런데 문제는 공식 문서에도 보안이 매우 취약하다고 언급이 되어 있다는 점입니다. 다른 인증방식으로 바꾸어야 할 듯 합니다.

 


 password_encryption은 postgresql.conf에서 설정할 수 있습니다. md5로 설정하거나, 아니면 scram-sha-256으로 설정할 수 있게 되어 있습니다.

 

 이것을 scram-sha-256으로 바꾼 다음에 저장합니다. 다음에, pg_hba.conf 파일에서, md5로 설정 되어 있는 부분을 scram-sha-256으로 바꾸어 보았습니다.

 

 당연하게도 맨 위에 있는 local all postgres peer는 건드리지 않았습니다. 이제 postgresql을 재시작 하고 로그인 하겠습니다.

 

 그랬더니 이번에는 password 인증이 실패했다고 뜹니다. 이건 또 왜 그럴까요?


 암호화 방식이 바뀌었기 때문입니다. 예를 들어 A라는 걸 a라는 방식으로 암호화 하면 QQ가 떴는데, b라는 방식으로 암호화 하면 QB가 뜬다고 해 봅시다. 암호화 방식을 a에서 b로 바꿨다고 해 보겠습니다. 그러면 내가 a라는 것을 입력하면 QB라는 것으로 암호화가 되어서 전달될 겁니다.

 

 문제는, 기존에 a라는 방식으로 암호화를 한 건 어딘가에 저장이 되어 있을 텐데요. QQ라는 것을 복호화 해서 a라는 걸 알아내고, 다시 이걸 b라는 방식으로 암호화를 해서 QB라는 걸로 바꿀 수 있을까요? 암호가 20자리라면 어떨까요? 복호화 하기 힘듭니다. 그래서, 모든 유저의 암호를 다시 재설정 하는 것이 필요합니다. 비밀번호 찾기를 했을 때, 내가 이전에 썼던 비밀번호를 알려주지는 않습니다. 대신에, 재설정을 할 뿐입니다. 그것과 동일하다고 보시면 됩니다.

 

 gh의 암호화 방식이 md5에서 scram-sha-256으로 바뀌었으므로, alter role을 이용해서 password를 바꿔줘야 합니다.

 

 그러고 나서, 다시 로그인을 해 보면, 성공적으로 로그인이 되었음을 알 수 있습니다. 암호화 방식은 나중에 api 구현 프로젝트를 하면서 다시 다룰 수 있으니, 익혀두시면 좋을 듯 싶습니다.