Skip to content

SSM 포트 포워딩을 통한 RDS 접속 시 Access Denied & Plugin not loaded 오류 해결 #14

@Tae4an

Description

@Tae4an

이 문서는 SSM 포트 포워딩 터널을 사용하여 로컬 MySQL Workbench에서 프라이빗 Amazon RDS 인스턴스에 접속하려 할 때 발생한 일련의 복합적인 오류들을 진단하고 해결한 과정을 단계별로 설명합니다.

1. 문제 상황

SSM 포트 포워딩 터널이 성공적으로 개통된 상태에서 로컬 MySQL Workbench를 통해 프라이빗 RDS 인스턴스에 접속을 시도했으나, 사용자 계정에 따라 다음 두 가지 오류 중 하나가 발생했습니다.

  1. admin 사용자 계정 사용 시 오류: Plugin 'mysql_native_password' is not loaded
  2. workbench_user 사용자 계정 사용 시 오류: Access denied for user 'workbench_user'@'localhost' (using password: YES)

중요한 점은, 동일한 자격 증명으로 같은 VPC 내 EC2 터미널에서 RDS에 접속하는 것은 성공적이었다는 것입니다. 문제는 로컬 PC(Mac)에서 SSM 터널을 경유하여 접속할 때만 발생했습니다.

2. 원인 분석 및 해결 과정

문제 해결을 위해 여러 가설을 세우고 다양한 시도를 했습니다.

시도 1: admin 사용자의 Plugin not loaded 오류 해결 (인증 방식 변경)

  • 가설: 초기 admin 사용자에게 발생한 Plugin 'mysql_native_password' is not loaded 오류는 MySQL Workbench가 RDS에서 사용하는 비밀번호 인증 방식과 호환되지 않아 발생하는 문제로 판단했습니다. MySQL 8.0부터 기본 인증 방식이 caching_sha2_password로 변경되었고, Workbench가 구형 방식(mysql_native_password)을 시도하다 실패했을 가능성을 염두에 두었습니다.
  • 해결 시도:
    1. EC2 터미널을 통해 RDS에 admin 사용자로 접속했습니다.
    2. admin 사용자의 인증 방식을 널리 호환되는 mysql_native_password로 변경하는 SQL 명령어를 실행했습니다.
      ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Your_RDS_Password';
      FLUSH PRIVILEGES;
  • 결과: 변경 후 MySQL Workbench에서 재접속을 시도했으나, 여전히 동일한 오류 (Plugin 'mysql_native_password' is not loaded)가 발생했습니다.

시도 2: MySQL Workbench 클라이언트 캐시 삭제

  • 가설: 서버 측 인증 방식을 변경했음에도 문제가 지속되는 것으로 보아, MySQL Workbench 클라이언트 자체의 캐시 문제일 가능성을 의심했습니다. Workbench가 admin 사용자에 대한 이전 접속 실패 기록이나 인증 방식 설정을 계속 기억하고 있어, 서버 측 변경 사항을 인지하지 못하는 상황을 가정했습니다.
  • 해결 시도:
    1. MySQL Workbench를 완전히 종료했습니다.
    2. 운영체제별로 Workbench의 접속 정보 파일(connections.xml, wb_options.xml)과 저장된 비밀번호(macOS의 키체인 접근, Windows의 자격 증명 관리자)를 모두 삭제하여 클라이언트 캐시를 완전히 초기화했습니다.
    3. Workbench를 다시 실행하고 새 커넥션을 만들어 admin 사용자로 재접속을 시도했습니다.
  • 결과: 캐시를 모두 삭제하고 새로운 상태에서 접속을 시도했음에도 여전히 동일한 오류 (Plugin 'mysql_native_password' is not loaded)가 발생했습니다.

시도 3: 새로운 workbench_user 생성 및 권한 부여

  • 가설: 클라이언트 캐시 문제도 아니라면, admin 사용자 계정 자체의 설정이 꼬였거나 클라이언트 호환성 문제를 일으킬 수 있다고 판단했습니다. 가장 확실한 방법으로 admin 계정 문제를 우회하고자 원격 접속 전용의 '새로운 사용자'(workbench_user)를 생성하기로 했습니다.
  • 해결 시도:
    1. EC2 터미널을 통해 RDS에 admin 사용자로 접속했습니다.
    2. workbench_usermysql_native_password 인증 방식으로 생성하고, 특정 데이터베이스에 대한 모든 권한을 부여했습니다.
      CREATE USER 'workbench_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Your_New_Password';
      GRANT ALL PRIVILEGES ON `<DB명>`.* TO 'workbench_user'@'%';
      FLUSH PRIVILEGES;
    3. MySQL Workbench에서 새로운 workbench_user 정보로 커넥션을 생성하여 접속을 시도했습니다.
  • 결과: Plugin 'mysql_native_password' is not loaded 오류는 사라졌지만, Access denied for user 'workbench_user'@'localhost' 오류가 발생했습니다. EC2 터미널에서는 동일한 workbench_user로 접속이 성공했음에도 불구하고 로컬 PC에서만 접속이 거부되는 현상이 나타났습니다.

시도 4: MySQL Workbench 버전 다운그레이드

  • 가설: 모든 서버 측 설정과 새 사용자 생성에도 불구하고 Access denied 오류가 지속되는 점, 그리고 EC2 터미널에서는 접속이 되는 점을 미루어 볼 때, MySQL Workbench 클라이언트 자체의 버그일 수 있다는 의심을 했습니다. 조사 결과, MySQL Workbench 8.0.40 및 8.0.41 버전에서 유사한 오류가 보고된Known Issue가 있음을 확인했습니다.
  • 해결 시도:
    1. 기존 MySQL Workbench를 완전히 제거했습니다.
    2. MySQL 공식 아카이브에서 문제 해결 사례가 보고된 이전 버전인 8.0.38을 다운로드하여 설치했습니다.
    3. SSM 터널을 다시 열고, 새로 설치한 Workbench에서 workbench_user로 재접속을 시도했습니다.
  • 결과: MySQL Workbench 버전을 다운그레이드했음에도 불구하고, 여전히 Access denied for user 'workbench_user'@'localhost' (또는 Plugin 'mysql_native_password' is not loaded) 오류가 발생했습니다. EC2 터미널에서의 성공과 대비되는 로컬 PC에서의 지속적인 실패는 문제의 원인이 MySQL 사용자 설정이나 Workbench 버전이 아닌, 내 PC 환경과 SSM 터널링 간의 충돌일 가능성이 매우 높다는 결론에 도달하게 했습니다.

최종 발견: 로컬 MySQL 서버의 3306 포트 점유

  • 심층 진단: netstat 명령어 등을 통해 로컬 PC의 네트워크 상태를 확인한 결과, 내 Mac에 이미 로컬 MySQL 서버가 실행 중이며 3306번 포트를 점유하고 있었다는 사실을 발견했습니다.
  • 원인 분석:
    1. 포트 점유와 연결 우선순위: aws ssm start-session 명령어로 localPortNumber: 3306을 지정하여 SSM 터널을 열었음에도 불구하고, 로컬 MySQL 서버가 이미 3306 포트를 LISTEN 중이었기 때문에, MySQL 클라이언트(CLI, Workbench)가 127.0.0.1:3306으로 접속을 시도하면 SSM 터널을 통해 RDS로 가는 것이 아니라 로컬 Mac에 설치된 MySQL 서버로 연결되었습니다.

      근거: [StackOverflow - another mysqld server running on port 3306 error](https://stackoverflow.com/questions/9918062/another-mysqld-server-running-on-port-3306-error)

    2. 각 오류의 진짜 의미:
      • admin 계정에서 Plugin 'mysql_native_password' is not loaded 오류가 발생했던 이유: 로컬 MySQL 서버가 mysql_native_password 플러그인이 비활성화된 최신 버전(예: 8.4 이상)이었기 때문입니다. 접속 요청이 RDS가 아닌 로컬 서버로 전달되었고, 로컬 서버가 해당 플러그인이 없다고 응답한 것입니다.
      • workbench_user에서 Access denied 오류가 발생했던 이유: workbench_user오직 RDS 서버에만 존재하고, 로컬 MySQL 서버에는 존재하지 않는 사용자였기 때문에, 로컬 서버가 접속을 거부한 것입니다.
    3. 결국, 서로 달라 보였던 두 가지 오류는 모두 **"잘못된 서버(로컬 MySQL)에 접속하고 있었다"**는 단 하나의 근본 원인에서 비롯된 것이었습니다.

3. 최종 해결책

문제의 근원인 로컬 MySQL 서버의 포트 점유를 해제하는 것이 최종 해결책이었습니다.

Step 1: 로컬 MySQL 서버 중지

  1. 로컬 MySQL 프로세스 확인:
    sudo lsof -i :3306
    출력 결과에 mysqld와 같은 프로세스가 있다면 실행 중이라는 의미입니다.
  2. 로컬 MySQL 서버 중지: (Homebrew로 설치한 경우)
    brew services stop mysql
    또는 프로세스 직접 종료:
    sudo pkill mysql
    sudo pkill mysqld
  3. 중지 여부 확인:
    sudo lsof -i :3306
    아무것도 출력되지 않아야 정상입니다.

Step 2: SSM 터널 재시작

로컬 MySQL이 완전히 중지되었음을 확인한 후, 기존 SSM 포트 포워딩 세션을 다시 시작합니다.

aws ssm start-session \
    --target <애플리케이션_EC2_인스턴스_ID> \
    --document-name AWS-StartPortForwardingSessionToRemoteHost \
    --parameters '{"host":["<RDS_엔드포인트>"],"portNumber":["3306"],"localPortNumber":["3306"]}'

터미널에 다음과 같은 성공 메시지가 나타나며 터널이 개통됩니다.

Port 3306 opened for sessionId my-pc-admin-xxxxxxxx.
Waiting for connections...

Step 3: MySQL Workbench에서 최종 연결 확인

SSM 터널이 열려있는 상태에서 MySQL Workbench나 터미널에서 127.0.0.1:3306으로 접속을 시도합니다.

mysql -h 127.0.0.1 -P 3306 -u workbench_user -D <DB명> -p

접속 시도 시 SSM 터널을 열어둔 터미널에 다음과 같은 메시지가 나타나며 성공적으로 연결됩니다.

Connection accepted for session [my-pc-admin-xxxxxxxx]

이제 아무런 오류 없이 성공적으로 RDS 데이터베이스에 연결되는 것을 확인할 수 있습니다.

4. 핵심 요약

  • SSM 포트 포워딩을 사용할 때 localPortNumber로컬 PC에서 이미 다른 서비스(예: 로컬 MySQL 서버)에 의해 점유되어 있지 않은지 반드시 확인해야 한다.
  • 로컬 포트가 점유되어 있으면, 클라이언트는 SSM 터널이 아닌 로컬 서비스에 연결되어 예상치 못한 Access denied 또는 Plugin not loaded 오류를 발생시킬 수 있다.
  • 문제 해결 과정에서 여러 가설을 세우고 검증하는 것이 중요하며, 때로는 가장 단순한 원인이 가장 찾기 어려운 문제일 수 있다.
  • 보안 모범 사례: admin 계정 대신 최소 권한의 원칙에 따라 workbench_user와 같은 전용 계정을 사용하는 것이 바람직하다. admin 계정은 비상시에만 사용하고, 일상적인 DB 접속에는 최소한의 권한을 가진 계정을 사용해야 한다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdocumentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions