1편
어제 비밀번호 안걸어서 레전드 사건 발생

비트코인 내놔 당했다
이거 삭제해야됨 해커 계속 들어옴
비밀번호를 잘 설정하자~!
MongoDB 사용자 인증 설정 가이드
MongoDB에서 사용자 인증을 설정할 때는 정확한 순서가 중요함. 이 순서를 따르지 않으면 인증이 활성화된 이후에 접근 불가능한 상황이 생길 수 있음. 다음은 보안을 강화하면서도 문제 없이 설정하는 권장 절차임.
권장 설정 순서
- MongoDB가 인증 없이 실행 중인지 확인
- MongoDB는 기본적으로 인증이 꺼진 상태로 시작됨. 따라서 처음 설치 후 특별히 설정을 하지 않았다면 인증 없이 접속 가능함. 이때 관리자 사용자를 먼저 만들어야 함.
- mongo 또는 mongosh 셸로 접속 후 admin DB로 이동
- mongo // 또는 mongosh use admin
- 관리자 권한을 가진 사용자 생성
userAdminAnyDatabase는 다른 사용자를 만들거나 권한을 부여할 수 있는 관리자 권한임. readWriteAnyDatabase는 모든 DB에 대해 읽기/쓰기 권한을 부여하는 역할임.db.createUser( { user: "adminUser", pwd: "yourStrongPassword", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" } // 필요에 따라 추가 ] } ) - 관리자 계정은 인증을 켜고 나서 MongoDB에 접속할 수 있는 유일한 통로임. 비밀번호는 강력한 것으로 설정해야 함.
- mongod.conf 파일에서 인증 활성화 설정
만약 security 섹션 자체가 없다면 새로 추가해도 됨.security: authorization: enabled - 설정 파일에서 아래와 같이 authorization: enabled를 추가하거나 주석을 해제함. 보통 이 파일은 /etc/mongod.conf에 위치함(Linux 기준).
- MongoDB 서버 재시작
- Linux: sudo systemctl restart mongod
- Windows: net stop MongoDB 후 net start MongoDB
- 설정을 반영하려면 MongoDB 서버를 재시작해야 함.
- 생성한 사용자로 재접속 후 인증 확인
또는 mongosh를 사용하는 경우도 위와 동일함. 정상적으로 로그인되고 show dbs 같은 명령이 실행되면 인증 설정이 완료된 것임.mongo -u adminUser -p yourStrongPassword --authenticationDatabase admin - 인증이 활성화되었으므로 이제부터는 사용자 이름과 비밀번호를 입력해야 접속 가능함.
왜 이 순서를 지켜야 하나?
- 인증이 꺼진 상태에서 사용자 생성하는 이유는, MongoDB는 기본적으로 인증 없이 누구나 접속 가능함. 이 상태에서 먼저 관리자 계정을 만들어놔야 나중에 인증이 켜졌을 때 접속할 수 있는 통로가 확보되는 것임.
- 만약 인증을 먼저 켜버리면 인증된 사용자가 없는 상태가 되어, 접속 자체가 불가능해짐. 이 경우 인증을 다시 끄고 재설정하는 번거로움이 생기게 됨.
결론:
반드시 인증이 꺼진 상태에서 관리자 계정을 먼저 만들고, 그 다음에 인증을 활성화하고 서버를 재시작하는 방식으로 진행해야 함. 이 순서를 어기면 MongoDB에 접근 자체가 막혀버릴 수 있음.
[사용자 관리]
use erp
데이터베이스 선택
db.createUser({
user:"koo",
pwd:"7654321",
roles:[{role:"readWrite",db:"erp"}]
});
사용자 등록 (아이디 / 패스워드 / 역할 / 사용DB)
역할은 readWrite면 충분함 super권한 안줘도됨 뚫리기나하지!!!!
| 역할 종류 | 역할 이름 | 적용 범위 | 설명 | 예시 |
| 데이터베이스 사용자 역할 | read | 특정 데이터베이스 | 특정 데이터베이스의 시스템이 아닌 컬렉션에 대한 읽기 전용 권한을 부여합니다. |
{ role: "read", db: "mydb" }
|
| readWrite | 특정 데이터베이스 | 특정 데이터베이스의 시스템이 아닌 컬렉션에 대한 읽기 및 쓰기(삽입, 업데이트, 삭제) 권한을 부여합니다. |
{ role: "readWrite", db: "erp" }
|
|
| readAnyDatabase | 모든 데이터베이스 | 모든 데이터베이스의 시스템이 아닌 컬렉션에 대한 읽기 전용 권한을 부여합니다. (admin DB에서만 정의 가능) |
{ role: "readAnyDatabase", db: "admin" }
|
|
| readWriteAnyDatabase | 모든 데이터베이스 | 모든 데이터베이스의 시스템이 아닌 컬렉션에 대한 읽기 및 쓰기 권한을 부여합니다. (admin DB에서만 정의 가능) |
{ role: "readWriteAnyDatabase", db: "admin" }
|
|
| 데이터베이스 관리 역할 | dbAdmin | 특정 데이터베이스 | 특정 데이터베이스에 대한 관리 작업(인덱스 생성, 통계 수집, 컬렉션 생성/삭제 등)을 수행할 수 있도록 합니다. 사용자 및 역할 관리는 제외됩니다. |
{ role: "dbAdmin", db: "erp" }
|
| userAdmin | 특정 데이터베이스 | 특정 데이터베이스에서 사용자 및 역할을 생성하고 수정할 수 있는 권한을 부여합니다. |
{ role: "userAdmin", db: "erp" }
|
|
| dbOwner | 특정 데이터베이스 | 특정 데이터베이스에 대한 **모든 권한 (readWrite, dbAdmin, userAdmin 포함)**을 부여합니다. 해당 데이터베이스의 소유자와 같습니다. |
{ role: "dbOwner", db: "mydb" }
|
|
| userAdminAnyDatabase | 모든 데이터베이스 | 모든 데이터베이스에서 사용자 및 역할을 생성하고 수정할 수 있는 권한을 부여합니다. (admin DB에서만 정의 가능) |
{ role: "userAdminAnyDatabase", db: "admin" }
|
|
| dbAdminAnyDatabase | 모든 데이터베이스 | 모든 데이터베이스에서 데이터베이스 관리 기능을 수행할 수 있는 권한을 부여합니다. (admin DB에서만 정의 가능) |
{ role: "dbAdminAnyDatabase", db: "admin" }
|
|
| 클러스터 관리 역할 |
clusterAdmin | 전체 클러스터 (admin DB) | 가장 높은 클러스터 관리 접근 권한을 제공합니다. (clusterManager, clusterMonitor, hostManager 역할의 권한을 포함) |
{ role: "clusterAdmin", db: "admin" }
|
| clusterManager | 전체 클러스터 (admin DB) | 클러스터에 대한 관리 및 모니터링 기능을 제공합니다. |
{ role: "clusterManager", db: "admin" }
|
|
| clusterMonitor | 전체 클러스터 (admin DB) | MongoDB 모니터링 도구(예: Cloud Manager, Ops Manager 모니터링 에이전트)에 대한 읽기 전용 접근을 제공합니다. |
{ role: "clusterMonitor", db: "admin" }
|
|
| hostManager | 전체 클러스터 (admin DB) | 개별 서버를 모니터링하고 관리할 수 있는 권한을 제공합니다. |
{ role: "hostManager", db: "admin" }
|
|
| backup | 전체 클러스터 (admin DB) | mongodump와 같은 백업 작업을 수행할 수 있는 권한을 제공합니다. |
{ role: "backup", db: "admin" }
|
|
| restore | 전체 클러스터 (admin DB) | mongorestore와 같은 복원 작업을 수행할 수 있는 권한을 제공합니다. |
{ role: "restore", db: "admin" }
|
db.getUsers();
생성된 가상의 사용자 리스트 출력
db.auth("koo","kona5520!");
로그인
db.dropUser("koo");
생성된 사용자를 삭제
다음단계를 위해 사용자 다시 만듦
db.changeUserPassword("koo","1234567");
비밀번호 변경
비밀번호는 적어도 7자리 이상으로 만들어야함
짧은 비번은 하루만에 뚫림
[Collection]
db.createCollection('members',{})
db.members.drop();
삭제
db.createCollection('members',{
capped:true,
size:1500,
max:20,
});
생성
db.getCollectionNames();
show collections
목록확인
use cms;
db.createUser({
user:"koo",
pwd:"1234567",
roles:[{role:"dbAdmin",db:"cms"}]
});
db.createCollection('board',{
capped:true,
size:1500,
max:10,
});
db.auth("koo","다른DB에만든사용자비번");
아이디가 같다고 같은 사용자아님 동명이인의 개념
[서버 세팅]
[nodejs]
node --version
nodejs 읎다
yum search epel-release
검색
yum install epel-release
설치
yum search nodejs
검색
yum install nodejs
설치
node --version
npm --version
둘다 잘 나오면 성공
[웹디렉토리 생성]
핵심 : 사용자, 권한
su cms
cd /home/cms
mkdir www
chmod 755 www
cd ..
chmod 755 cms
만약 다른 사용자로 만들었다면 chown 사용
[nginx 설정]
vi /etc/nginx/nginx.conf
서버블록의 root 경로를
/home/cms/www;
로 변경
systemctl restart nginx;
재실행
[nodejs]
su cms
cd /home/cms/www
npm install mongodb
몽고라이브러리 설치
[js파일 하나 생성]
db.js
//해당 node서버에서 라이브러리를 호출
const { MongoClient } = require('mongodb');
//mongodb 접속 경로 및 데이터베이스명
const uri='mongodb://test.koona.kr:27017/cms';
var client = new MongoClient(uri); //접속체크
var db = null;
async function abc(){
try{
await client.connect(); //연결 응답 대기 상황
console.log("MongoDB connect success!");
}catch(error){
console.log(error);
}finally{
}
}
abc(); //해당 데이터베이스를 연결하는 함수를 호출
[js파일 업로드]

만든 js를 업로드하기

[js파일 실행]
이제 가동하자
node db.js

[몽고에 더미데이터 넣기]
db.board.insertOne({"idx":1,"subject":"공지사항 테스트","writer":"관리자","texts":"공지 테스트중"})
넣기
db.board.find();
확인

[js파일 재업]
//해당 node서버에서 라이브러리를 호출
const { MongoClient } = require('mongodb');
//사용자 접속 정보
var userid = encodeURIComponent('koo');
var userpw = encodeURIComponent('비번');
var host = "test.koona.kr:27017";
var dbnm = "cms";
//mongodb 접속 경로 및 데이터베이스명
const uri=`mongodb://${userid}:${userpw}@${host}/${dbnm}`;
var client = new MongoClient(uri); //접속체크
var db = null;
async function abc(){
try{
await client.connect(); //연결 응답 대기 상황
console.log("MongoDB connect success!");
db = client.db(dbnm); //DB연결 정보 및 컬렉션 연결 준비
var collection = db.collection('board'); //컬렉션 이름
var query = await collection.find({}).toArray();
console.log("공지 리스트 : ", query);
}catch(error){
console.log(error);
}finally{
}
}
abc(); //해당 데이터베이스를 연결하는 함수를 호출
[서버에서 실행]

굿 👍