파이썬 Python

[Python] linux 환경에서 DB 계정 정보를 숨기고, mssql을 연동해보자.

sseozytank 2023. 12. 4.

사내 코드를 공유할 수 있는 jupyter hub를 사용하고 있다. 실무자들은 직접 보지만, 관련자들은 PDF나 HTML로 보고있는데 이렇게 파일을 왔다갔다 하다가, 코드에 들어가 있는 DB 계정정보가 노출될 수 있다. 그렇기 때문에 DB 계정 정보를 숨겨두는 것이 반드시 필요하다. 

[ DB 계정 정보를 저장하고 숨기기 ]

1.리눅스 환경에서 Terminal을 열어주기

 

우리 jupyter hub는 linux ubuntu 환경이기 때문에, 여기서 Terminal을 열어준다.

 

2. DB 계정 정보를 담은 .env 생성 하고 .conf에 숨겨주자 

*env와 .env의 차이점

더보기

 env는 노출되는 것이고 .env는 숨김 처리

 

 1) env로 생성했을 시 ls 쳤을 시 바로 노출 

 

파이썬 디렉토리 란에 노출

 

2) .env로 생성했을 때 숨김 파일을 조회하는 ls -al을 쳐야만 숨겨진 .env가 등장한다. 

당연히 파이썬 디렉토리 란에 노출되지 않는다.

 

1) 터미널에서 .env 에디터로 계정 정보 입력

vi .env

2) 에디터에서 계정 정보 입력 

1️⃣ a 입력하여 insert 모드로 전환

2️⃣ 계정 정보 입력 후 

DB_HOST="your host"
DB_USER="your user"
DB_PSWORD="your password"
DB_DATABASE="your database"
DB_PORT="your port"

 

3️⃣ esc -> :wq (저장하고 나가기)  

*파일을 잘못 만들었어요!   
rm .env  (해당 파일을 삭제)  
rm -i .env  (삭제 시 정말 삭제할 지 확인하는 메시지를 표시)  
rm -f .env  (삭제 시 확인하지 않고 바로 삭제 (f는 Force의 약자)  

 

 

*.env에 내가 뭐라 썼는지 확인하고 싶어요!
cat .env

 

3) .conf 생성 

.env 를 만들어서 숨겼다지만, 그래도 home 에 노출되어있기 때문에 설정정보들을 저장할 .conf 디렉토리를 만들어 준다. (보안도 걸어줄 것이다) 

mkdir .conf
*디렉토리를 잘못 만들었어요! 
rm -r .conf (해당 디렉터리를 삭제)
rm -rf .conf (r옵션과 f 옵션을 합친 것으로,  .conf 디렉토리와 그 아래에 있는 하위 디렉토리를 강제로 전부 삭제 (사용시 주의) 
rm -f .env  (삭제 시 확인하지 않고 바로 삭제 (f는 Force의 약자)

 

*이전 디렉토리로 가고 싶어요
cd - 

4. .env를 .conf로 이동시켜주자 

mv .env .conf

 

그럼 잘 옮겨졌는지 확인해보자

cd .conf 
ls -al

 

잘옮겨짐을 확인했다! 

*내가 지금 어느 경로에 있는지 헷갈려요
pwd (현재 경로 출력)

 

 

3. .conf에 권한을 설정해주자 

보안을 위해 이렇게 꽁꽁 숨겨서 만들었다. 하지만 어차피 ls -al을 통해 노출된다. 따라서 해당 디렉토리에 및 env 파일에 대한 권한을 설정해주어야 한다. 

1) linux 파일 권한 이해 

https://m31phy.tistory.com/256

 

권한 2진수 8진수 설명
--- 000 0 권한 없음
--x 001 1 실행 전용 권한
-w- 010 2 쓰기 전용 권한
-wx 011 3 쓰기 및 실행 권한
r-- 100 4 읽기 권한
r-x 101 5 읽기 및 실행 권한
rw- 110 6 읽기 및 쓰기 권한
rwx 111 7 읽기,쓰기 및 실행 권한

 

리눅스 파일 권한은 이렇게 되어 있고 실제로 아래와 같이 나타나고 있다. 

 

그런데, 위에는 9자린데 우리 화면엔 10자리가 나온다. 

맨 앞의 문자 1자리는 파일 타입을 나타내는 것이고, 그 다음 9자리 부터 권한을 나타내는 부분인 것이다. 

 

- : 일반 파일

d : 폴더 / 디렉토리

l : 심볼릭 링크 

b : 블록 타입 특수 파일 

c : 문자 타입 특수 파일

p : 파이프 

s :소켓 

 

따라서 위에 두 정보를 가지고 해당 사진을 해석해 보면 

  • drwxr-xr-x -> d (디렉토리 타입) / rwx (파일 소유자에 대해서 읽기, 쓰기, 실행 권한) / r-x (파일 소유자의 그룹에 대해 읽기, 실행 권한) / r-x (시스템에 대한 다른 사용자에 대해 읽기 및 실행 권한)
  • -rw-r--r-- -> - (일반 타입) / rw- (파일 소유자에 대해서 읽기, 쓰기 권한) / r-- (파일 소유자의 그룹에 대해 읽기 권한) / r-- (시스템에 대한 다른 사용자에 대해 읽기 권한) 
  • -rw------- -> - (일반 타입) / rw- (파일 소유자에 대해서 읽기, 쓰기 권한) / --- (파일 소유자의 그룹에 대해 권한 없음) / r-- (시스템에 대한 다른 사용자에 대해 권한 없음) 

2) 파일 권한을 바꿔보자 

현재 나는 파일 '소유자의 그룹' 으로 지정되어 있다. 

.conf 와 .env와 모두 파일 소유자에 대한 권한은 rwx로, 파일 소유자의 그룹에 대한 권한은 r-x로 , 이 외 다른 사용자는 권한이 없도록 설정해주겠다. chmod 명령어를 사용해주면 된다. 

*chmod?
1️⃣ chmod [옵션] [사용자] [설정기호] [권한] [파일 혹은 디렉토리]
2️⃣ chmod [변경하고자 하는 권한 값] [파일 혹은 디렉토리] (권한 변경 명령어)

 

1️⃣ 기호를 통해 권한 변경

ls -al

 

조회 결과, .conf의 현재 권한은 drwxr-xr-x로 나타난다.  

d / rwx / r-x / r-x 이므로 다른 사용자에 대한 권한을 ---로 수정해주면 된다. 

권한 관련 유저 관련
+ 권한 추가 u user, 소유자    
- 권한 제거 g group, 소유 그룹    
= 권한 부여 o other, 일반 사용자    
    a all, 모든 사용자 (미 입력 시 default값) 

 

현재 : d/rwx/r-x/r-x  ->  원하는 권한 d/rwx/r-x/---

그러므로 o에 대해 -r , -x를 해주면 된다. 

chmod o-r,o-x .conf

 

 

2️⃣ 숫자를 통해 권한 변경

현재 : d/rwx/r-x/r-x  ->  원하는 권한 d/rwx/r-x/--- 

그러므로 현재는 755 인 것을 750으로 변경해주면 된다. 

chmod 750 .conf

#하위 디렉토리와 그 안의 파일 권한까지 모두 변경
chmod -R 750 .conf

 

-R 옵션을 붙혀주면, 하위 디렉토리와 파일까지의 권한을 모두 변경하기 때문에 위처럼 사용해주면, .env의 권한까지 바껴있음을 확인할 수 있다. 

 

드디어 기초 셋팅이 끝났다! 

3.python 에서 dotenv를 통해 mssql 데이터 불러오기 

!pip install python-dotenv

 

설정한 환경변수 불러오기

import os 
%load_ext dotenv
%dotenv #.env 파일에서 환경 변수를 읽어와 설정 

#그렇지만 우리는 .conf 안에 .env를 숨겨놨으니 아래와 같이 
%dotenv /home/경로/.conf/.env

#경로를 모를 땐, pwd로 찾아오자

 

pyodbc 라이브러리로 데이터 베이스 연결

import pyodbc

server = os.getenv("DB_HOST")
database = os.getenv("DB_DATABASE")
port = os.getenv("DB_PORT")
username = os.getenv("DB_USER")
password = os.getenv("DB_PSWORD")
conn_str = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server},{port};DATABASE={database};UID={username};PWD={password};TrustServerCertificate=Yes'

 

conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

 

import pandas as pd
try:
    # 연결
    conn = pyodbc.connect(conn_str)
    cursor = conn.cursor()

    # 쿼리 실행
    cursor.execute("SELECT 컬럼 FROM 테이블")

    df_local = pd.DataFrame.from_records(cursor.fetchall(), columns=[desc[0] for desc in cursor.description])

    cursor.close()
    conn.close()


except pyodbc.Error as e:
    print("Error: ", e)

print (df_local.head())

 

이렇게 pyodbc로 mssql 데이터 불러오기까지 끝! 

 

댓글