본문 바로가기
개발/에러해결

mongod --keyFile 시 permissions on /etc/mongodb.key are too open 또는 /etc/mongodb.key: bad file

by amkorousagi 2023. 5. 12.

mongod --keyFile 시 

permissions on /etc/mongodb.key are too open

또는

/etc/mongodb.key: bad file

 

key: bad file or key are too open 에러 내용


2023-05-12 14:01:51 {"t":{"$date":"2023-05-12T05:01:51.904+00:00"},"s":"I", "c":"ACCESS", "id":20254, "ctx":"main","msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"permissions on /key/mongodb.key are too open"}}}
2023-05-12 14:01:51 {"t":{"$date":"2023-05-12T05:01:51.711+00:00"},"s":"I", "c":"ACCESS", "id":20254, "ctx":"main","msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"error opening file: /etc/mongodb.key: bad file"}}}

docker-compose를 활용해 mongodb replica set을 구축하는 도중 위와 같은 에러들을 만났습니다.

 

key: bad file or key are too open 에러 원인


permissions on /etc/mongodb.key are too open :

keyFile의 mode가 소유자 읽기 전용(400)이 아닌 다른 유저들이 읽을 수 있는 등 보안이 필요한 keyFile에 올바르지 않은 mode를 가지고 있기 때문입니다.

 

/etc/mongodb.key: bad file :

keyFile의 owner가 mode가 소유자 읽기 전용(400)이지만 keyFile의 소유주(owner)가 mongodb가 아니기 때문에 mongodb가 keyFile을 읽지 못하기 때문입니다.

 

key: bad file or key are too open 해결 방법


올바른 keyFile 예시 : 400 모드이며 소유주가 mongodb(999)

keyFile을 소유자 읽기 전용(400) mode로 변경하고 owner를 mongodb:mongodb로 변경하면 됩니다.

mongodb의 userid와 groupid는 기본적으로 999입니다.

 

해당 명령어는 다음과 같습니다.

openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
chown 999:999 mongodb.key # 또는 mongodb:mongodb

 

 

 

key: bad file or key are too open 해결 방법 in Window, docker compose


일반적으로 위의 방법대로 하면 해결됩니다.

그러나 특수한 경우에는 해결이 되지 않는 경우가 있습니다.

 

위의 해결법은 Linux 로컬에서 keyFile을 만들고 로컬에서 mongodb를 실행하는 경우입니다.

저의 경우에는 Window 로컬에서 mongodb replica set을 구축하기 위해서 keyFile을 만들고 이를 docker volume mount를 사용해서 keyFile을 공유하여 docker compose에서 command : mongod 등으로 mongodb를 실행합니다.

 

이 경우 두가지 정도 문제가 있습니다. 문제와 해결 방법에 대해 말씀드리겠습니다.

 

1. window에서는 아무리 권한 설정을 해도 적용되지 않는다.

window에서 권한 설정과 소유주 변경을  cmd나 powershell과 같은 command line으로 하든 직접 "파일->속성" 등의 GUI로 하든 실제 docker에서 받아서 보면 아무런 효과가 없습니다.

(window의 chmod, chown, icacls 등의 명령어는 효과가 없었습니다. cat이나 cp로 복사도 해보고 했지만 전부 삽질이었습니다)

 

해결 방법 :

window(cmd, powershell)가 아닌 linux에서 keyFile을 만들고 모드 및 소유주를 설정하셔야 합니다.

이는 이미 사용하고 있는 docker container 안에서 파일을 만들면 가능합니다.

 

1. volume을 공유하기 위한 간단한 docker-compose.yml을 작성합니다.

# Use root/example as user/password credentials
version: "3.8"

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "3015:80"
    volumes:
      - ./key:/key

 

2. docker compose를 실행합니다.

docker-compose up -d

 

3. docker desktop의 터미널이나 "docker exec -it nginx bash"의 명령어로 컨테이너에 접속하여 keyFile을 만들고 권한과 소유주를 설정합니다.

cd /key
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
chmod 999:999 mongodb.key # 또는 mongodb:mongodb

 

4. 이제 생성된 올바른 keyFile로 mongodb를 실행합니다! (docker-compose.yml의 command와 volume을 변경)

# Use root/example as user/password credentials
version: "3.8"

services:
  mongo2:
    image: mongo
    container_name: mongo2
    restart: always
    ports:
      - "4002:27017"
    environment:
      - .env
    volumes:
      - ./mongo2:/data/db
      - ./key:/key
    command: mongod --replSet rs0 --bind_ip_all --port 27017 --oplogSize 128 --keyFile /key/mongodb.key

 

 

2. docker volume mount를 하게 되면 권한이 바뀌어 보인다.

docker volume mount

실제로는 파일의 mode가 바뀌지 않지만, docker volume mount를 하게 되면

그 파일이 실제로 파일이든 디렉터리이든 무조건 디렉터리를 의미하는 d라는 mode로 표시되고

그 파일의 실제 모드와 상관없이 항상 rwxrwxrwx의 모든 권한이 열리게 됩니다.

이는 docker volume mount에서 read only mode를 적용하여도 동일합니다.(:ro)

 

해결 방법 :

하지만 실제 파일의 mode와 owner은 바뀌지 않기 때문에 문제가 없습니다.

즉, 올바른 keyFile을 만드셨다면 신경 쓰지 않아도 됩니다.

 

참고 자료


 

Try Docker Compose

 

docs.docker.com

 

 

 

Deploy a Replica Set — MongoDB Manual

Docs Home → MongoDB Manual This tutorial describes how to create a three-member replica set from three existing mongod instances running with access control disabled.To deploy a replica set with enabled access control, see Deploy Replica Set With Keyfile

www.mongodb.com

 

MongoDB replica set configuration

MongoDB is a NoSQL database that is a leader in its class. It is popular because it is fast and at the same time stable and highly…

faun.pub

 

댓글