6 리눅스에서 python 프로젝트 clone 해오기

|

views

이전 포스팅 보러가기

✔ 2.4 리눅스에서 python 프로젝트 git clone 해오기

1, pycharm에서 upgsql_crud 프로젝트 생성

굳이 파이참이 아니여도 상관 없다. ( 파이참이 아니라면 가상환경을 직접 만들어 주어야 한다.)

(이미 만든 프로젝트가 있다면 pass)


2, 패키지 의존성 파일 생성

pip freeze > requirements.txt

해당 프로젝트의 모듈 정보를 txt파일로 만들어준다.

psycopg2==2.8.3


3, github commit (venv 및 프로젝트 설정 파일 ignore)

나는 pycharm프로젝트를 사용하는데, 여기서 .ideavenv를 체크 해제 하거나 Ignore을 선택해 주면 된다.

pycharm을 사용하지 않더라도 git add를 할때 저 둘을 제외하고 add해주면 된다.

ignore all files under 선택

views

git push를 해준다.


4, 리눅스에서 git clone 받기

해당 git 주소를 이제 python-projects 밑에 clone 해 올 것이다.

git clone https://github.com/jungeunlee95/upgsql_crud.git

views


5, 가상환경 생성(isolationize)

[root@localhost python-projects]# cd upgsql_crud

[root@localhost upgsql_crud]# virtualenv venv : 가상환경 만들기

# source venv/bin/activate : 가상환경 실행


6, 의존성 파일 설치

기존 python프로젝트에서 만들어준 의존성 파일을

linux 가상환경에 설치해줘야한다. (공유)

(env) [root@localhost upgsql_crud]# pip install -r requirement.txt

views

설치를 한 뒤 해당 프로젝트 가상환경의 설치 경로에 가면 설치가 된 것을 확인 할 수 있다.


7, 실행

views

성공!


local에서 리눅스 python프로젝트를 pycharm에 git clone 해온다면!?

로컬에서 git clone을 해온 뒤 pycharm의 project interpreter에서 venv를 설정해주면 된다.

settings -> project interpretor

views

terminal에서 가상환경을 실행한 뒤 의존성 파일을 실행하면 된다.

call venv/scripts/activate

pip install -r requirement.txt

pip list : 리스트 확인하기


✔ 2.5 upgsql_crud프로젝트의 test_crud.py를 고립시키지 않고(venv 사용 X) 실행하기

해당 프로젝트의 가상환경 아래 루트가 sys path에 걸려있으면 된다.

가상환경 아래의 루트 확인하기

가상환경의 python3를 실행한뒤 sys.path를 찍어본다.

views

# cd /root/dowork/python-projects

# export PYTHONPATH='/root/dowork/python-projects/upgsql_crud/venv/lib/python3.7/site-packages' : path 등록


위처럼 설정을 해준다면, 이제 가상환경을 실행하지 않아도 실행할 수 있게 된다.

실행 : [root@localhost python-projects]# python3 upgsql_crud/test_crud.py





5 linux에 파이썬 가상 개발 환경 구성하기(Virtual Environments)

|

views

Python Isolation Tools (Virtual Environments)

python의 가상환경 툴은 여러가지가 있다.

파이썬에서 가상환경을 쓰는 이유?

파이썬은 파이썬 버전 별로 다수의 서브 버전이 존재하며, 엄청난 수의 패키지를 만들고 공유하고있다. 또 이런 패키지들은 개별적인 버전들을 갖고 있다.

만약 컴퓨터 한대에서 여러개의 프로젝트를 만들어서 프로그램을 돌릴경우, 파이썬 애플리케이션의 런타임 버전과 라이브러리 충돌이 일어나면 문제가 발생할 것이다.

이 문제가 발생하는 이유는 파이썬 버전과 라이브러리 패키지 등이 전역적으로 설치되어서 사용되기 때문이다.

이를 해결하기 위하여 파이썬은 각각 애플리케이션 별로 독립적인 환경을 만들어줘야한다.

파이썬 가상 환경을 구성하기 위해서는 여러가지 툴이 필요하다.

1. virtualenv : python2 부터 사용하던 가상환경 라이브러리
2. venv 	  : python 3.3 이후부터 기본 모듈
3. pyenv	  : Python Interpretor Version Manager
4. conda	  : Anaconda Python 설치했을 때 사용할 수 있다.
5. etc		  : virtualenvwrapper, buildout ...

먼저 [1.virtualenv]와 [2.venv]로 가상환경을 구성하는 법에 대해서 알아보았다.


✔ 1. virtualenv로 가상환경 구성하기

1, 설치

원래 python의 모듈 실행은 python3 -m pip 이렇게 해야하는데, 스크립트 제공해줘서 pip3 or pip로 사용할 수 있다.

상위로 위치를 옮기기 : # cd

virtualenv 설치하기 : # pip3 install virtualenv


2, 프로젝트 생성

# cd dowork/ - 나의 project들을 관리 디렉토리

# mkdir python-projects - python project를 관리하는 디렉토리 생성하기

# cd python-projects - 디렉토리로 들어가기

# mkdir loganalysis - loganalysis라는 이름의 python project 생성하기


3, 가상환경 생성

# cd loganalysis - 프로젝트로 들어가기

# virtualenv venv - 가상환경 만들기

: 전역에 있는 파이썬을(/cafe24/python3.7/) 우리 프로젝트에 venv라는 디렉토리 밑으로 복사한다.

views


4, 가상환경 구동

# source venv/bin/activate


5, 가상환경 확인

(venv) # python --version

가상환경이 실행되면 제일 앞에 (가상환경이름) 이 붙게된다.


6, 가상환경 나가기 : # deactivate

views

가상환경일 경우 python3.7.3. 버전을 사용하고, 가상환경을 나오면 전역으로 사용하는 python2.6.6을 사용하게 된다.


✔ 2-2 venv로 가상환경 구성하기

# deactivate : 이전의 loganalysis의 가상환경 나오기

# cd ..

# mkdir loganalysis2 : 새 프로젝트 만들기

# cd loganalysis2/

# python3 -m venv venv : 가상환경 만들기

# source venv/bin/activate : 가상환경 실행


✔ 2.3 간단한 postgres 연결 모듈 테스트 해보기

# cd loganalysis : 프로젝트 들어가기

# source venv/bin/activate : 가상환경 실행

# pip install psycopg2 : psycopg2 모듈 설치

여기서 install한 psycopg2는 어디에 다운된걸까?

/root/dowork/python-projects/loganalysis/venv/lib/python3.7/site-packages

해당 프로젝트 가상환경 밑에 다운이 되어있다.


test를 위한 파이썬 파일 만들기

해당 파일에는 미리 만들어 놓은 postgresql 연결 정보를 적어주었다.

각자 사용하는 db의 연결 정보를 넣어주면 된다.

(venv) [root@localhost loganalysis]# vi test_connect.py

try:
    conn = psycopg2.connect(
        user='webdb',
        password='webdb',
        host='192.168.1.52',
        port='5432',
        database='webdb',
        )
    cursor = conn.cursor()
    cursor.execute('select version()')
    record = cursor.fetchone()
    print(f'connected to - {record}')

except Exception as e:
    print(f'error : {e}')

finally:
    'conn' in locals() \
    and conn \
    and conn.close()

    'cursor' in locals() \
    and cursor\
    and cursor.close()


💥 error가 발생했다.

views

import 할 수 없다!?

python path가 안잡혀서 에러가 나는 것이다.

이유 : pgsql 링크가 잘못 되어있었다.

postgres < 10.8인 경우 다음 사항 확인해야 할 것이다.

# cd /usr/lib64

# rm -f libpq.so.5 : 링크 삭제

# ln -s /cafe24/pgsql/lib/libpq.so.5 libpq.so.5 : 링크 걸기


에러 해결! :o:

(venv) [root@localhost loganalysis]# python test_connect.py
connected to - ('PostgreSQL 10.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23), 64-bit',)



다음 포스팅 보러가기

4 리눅스(CentOS6.9)에 Python3.7.3 버전 설치하기

|

1 Python 설치하기

1-1 기본 라이브러리 설치

Python 설치 시 필요한 기본 라이브러리를 먼저 설치해야한다.

# yum -y install openssl

# yum -y install openssl-devel

# yum -y install bzip2-devel

# yum -y install sqlite-devel

# yum -y install zlib-devel

# yum -y install libffi-devel


⭐ python 3.7.x 버전에서는 libressl 2.6.4 이상이 필요하다.

다운로드 링크 : https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/

1, 최신 버전 소스다운

views

wget으로 다운받기 : # wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.9.2.tar.gz

[설치확인]

[root@localhost ~]# ls
libressl-2.9.2.tar.gz


압축 풀기 : # tar xvfz libressl-2.9.2.tar.gz

[확인]

[root@localhost ~]# ls
libressl-2.9.2  libressl-2.9.2.tar.gz


2, 빌드 환경 설정하기

압축 해제된 디렉토리로 들어가기 : # cd libressl-2.9.2

# ./configure --prefix=/usr/local/ssl

./configure 은 인스톨 하기 위한 환경을 설정하는 것

--prefix={경로} 는 컴파일 된 프로그램을 설치하는 위치


3, 컴파일 및 설치

# make

# make install


4, 공유 라이브러리 자동 로딩 설정

libressl을 공유라이브러리에 설정해줘야한다.


⭐ 잠깐! 공유라이브러리란!?!?

공유 라이브러리는 프로그램이 시작할때 적재되는 라이브러리이다.

공유 라이브러리가 제대로 설치된다면, 그다음에 시작하는 모든 프로그램은 자동적으로 새 공유 라이브러리를 사용한다.

프로그램들은 일반적으로 필요한 기능 중 특정 기능이 이미 구현되어 있으면 그 기능이 구현된 파일을 메모리에 올린 후 그 기능을 사용하게 된다.

이처럼 한 프로그램이라 하더라도 일반적으로 사용되는 여러 기능이 내부에서 다른 so 파일들을 통해서 이루어 지게 된다.

공유라이브러리와 연결된 프로그램을 실행하면 내부적으로 dynamic loader 프로그램이 먼저 동작해서 아래의 순서를 진행한다.

1, dynamic link된 공유 라이브러리 찾아 메모리에 로딩

2, entry function을 찾아 호출

3, 프로그램 실행

linux에서 공유라이브러리 로더 이름은 ld.so이다. 여기서 so는 shared object라는 뜻이다.


so 파일을 찾는 경로 설정은 일반적으로 3가지로 할 수 있다.

1. system default 경로
2. LD_LIBRARY_PATH
3. binary code 에 hard-coding 된 경로

1. system default
> 일반적으로 /usr/local/bin 과 /usr/bin 이다. 이 값은 /etc/ld.so.conf 파일에 설정이 된 값이다.
> 만약 내가 어떤 프로그램을 만들었고, 그것을 내 프로그램이 설치된 경로 밑의 lib 경로에 넣고 그것을 ld.so.conf 에 넣고 싶으면, /etc/ld.so.conf.d/ 경로 밑에 *.conf 파일 이름으로 저장 후 그 파일에 그 경로를 집어 넣으면 된다.

2. LD_LIBRARY_PATH - 환경변수 -> 권장되는 방법은 아님
/etc/profile파일에 아래 추가
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib

3. binary code 에 hard-coding 된 경로(매우 드문 경우)
> 개발자가 아예 소스코드에 so파일 경로를 설정해 버린 경우이다.
> 개발자가 직접 hard-coding한 경로에 so파일을 가져다 놓으면 된다.

나는 [1. system default 경로]로 설정을 해주었다.


먼저 2번 빌드환경 설정하기에서 --prefix={경로}로 지정해준 디렉토리로 들어가야한다.

# cd /usr/local/ssl/


위에서 설명한 것 처럼 ssl.conf파일을 만들어서 경로를 입력해준다.

# vi /etc/ld.so.conf.d/ssl.conf

/usr/local/ssl/lib 경로를 넣어주면 된다.

views


# ldconfig -v | grep ssl : 확인하기

views

자, 이제 기본 라이브러리 설치 및 설정을 마쳤다.

이제 파이썬 3.7.3버전을 설치해보자!

위의 libressl 설치 방법과 비슷하다.

1-2 Python 3.7.3 설치하기

1, python 다운로드

# cd

# wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

# tar xvfz Python-3.7.3.tgz


#### 2, 빌드

# cd Python-3.7.3

# ./configure --prefix=/usr/local/cafe24/python3.7.3 --with-openssl=/usr/local/ssl --enable-shared

빌드환경 구성시 openssl를 공유라이브러리에서 사용할 것이며, 아파치도 사용해야하니 –enable–shared 설정을 넣어준다.


2-2, 설치

# make

make후에 체크해봐야 할 것이있다.

찾을 수 없는 모듈 목록에 ssl이 있으면 안된다. 없으므로 성공!

views

# make install


#### 3, 공유 라이브러리 로딩 설정

# vi /etc/ld.so.conf.d/python.conf에 /usr/local/cafe24/python3.7/lib를 넣어준다.

views

# ldconfig -v | grep python : 확인해보기

views


4, 링크설정

위의 python.conf 파일에서 설정해준 경로는 python3.7이므로, 해당 경로에 맞게 python3.7 -> python3.7.3 링크 설정을 해주자!

# cd /cafe24

# ln -s python3.7.3/ python3.7


5, PATH 작업

python 홈을 path 에 등록해주어야 한다.

# vi /etc/profile

export PATH=$PATH:/usr/local/cafe24/python3.7/bin 넣어주기

views

:wq로 나오기

# source /etc/profile : 재시작


6, python 설치 완료!

# python3 --version

views

3 리눅스와 Xshell(터미널 프로그램) 연결하기

|

[1] Xshell이란 ❓

  • 텔넷/SSH 클라이언트 프로그램이다.

    텔넷? - 인터넷을 통해 원격 호스트 컴퓨터에 접속할 때 지원되는 인터넷 표준 프로토콜(멀리 떨어진 곳 컴퓨터를 마치 자신의 PC를 사용도록 해주는..)

    SSH? - Secure Shell Protocol, 컴퓨터와 컴퓨터가 네트워크를 통해 서로 통신할 때 보안적으로 안전하게 통신하기 위해 사용되는 프로토콜

  • 시큐어 셸(Secure Shell, SSH)은 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가리킨다.
  • 기존의 rsh, rlogin, 텔넷 등을 대체하기 위해 설계되었으며, 강력한 인증 방법 및 안젂하지 못한 네트워크에서 안젂하게 통신을 할 수 있는 기능을 제공한다. 기본적으로는 22번 포트를 사용.

[2] Xshell 설치하기

설치 링크 : https://www.netsarang.com/ko/free-for-home-school/

가정 및 학교 내 사용자를 위한 무료 라이선스를 다운받았다.


[3] 리눅스와 연결하기

1, Xshell을 실행하면 아래의 화면이 나온다.

views


2, 리눅스에서 ip를 확인하자

views

나의 ip는 192.168.1.45


3, 접속 시도

views
views

linux root계정의 비밀번호 입력


4, 접속 성공!

views


이제 linux를 더 편한 터미널 프로그램에서 작업할 수 있다.

views


CUI, GUI 차이 : CUI에 익숙해져야함

1 - CUI : Character User Interface

컴퓨터하고 사용자하고 글자로 명령을 주고 받는 방식

작동방식 : main에서 출발하여 순차적으로 알아서 쭈욱 실행되는 형태

2 - GUI : Graphic User Interface

그래픽 화면에서 버튼을 누르거나 해서 컴퓨터에게 일을 시키는 방식

작동방식 : 사용자가 버튼을 누르거나 어떤 명령을 내릴때까지 기다리다가 명령을 받으면 해당 처리를 하는 방식 ==> 이벤트 드리븐 방식





1. 웹 애플리케이션의 보안 문제점

|

책 : [웹 해킹 & 보안 완벽 가이드]를 읽으면서

공부한 내용을 정리하는 곳입니다.


[1] 웹 애플리케이션의 발전

인터넷의 초창기에 월드와이드웹(WWW)은 단지 웹 사이트였다.

정적인 문서만을 담고 있는 정보 저장소였으며, 주요 정보는 서버에서 브라우저로 한쪽 방향으로 흐르는 형태였다.

웹 사이트를 호스팅하는 데 따르는 보안 위협은 주로 웹 서버 소프트웨어와 연관된 취약점에서 오는 것이었다. (당시에는, 그 사이트 파일을 변조하거나, 불법 파일 공유 사이트로 활용하는 것이 전형적인 공격 형태)

오늘날 웹사이트는 사실상 애플리케이션으로 서버와 브라우저 간의 쌍방 간 정보 흐름에 기반을 둔 매우 실용적인 애플리케이션이다.

사용자에게 제공되는 내용은 즉석에서 동적으로 생성되며, 각 사용자에게 맞춰 작성된다. 이런 정보들은 매우 중요하고 개인적이다.

웹 애플리케이션은 이로운 면도 있지만 새롭고 중요한 보안 위협도 함께 갖고 있다.


일반적인 웹 애플리케이션 기능

일반적은 웹 애플리케이션 기능은 쇼핑, 사교, 뱅킹, 웹 검색, 경매, 도박, 웹로그, 대화형 정보등이 있으며,

  • HR(인사 관련) 애플리케이션
  • 메일서버, 가상머신 관리 등 주요 관리자 인프라
  • 문서 공유, 프로젝트 작업 흐름 관리 등 협력 소프트웨어(매우 중요한 보안 관리 문제 야기)
  • 기업 애플리케이션

등이 있다.

이처럼 ‘내부’ 애플리 케이션으로만 여겨졌던 예전과 달리 외부로 직접 서비스를 제공함으로써 비용을 단축하는 경향이 커졌다.

이런 방식을 ‘클라우드’ 솔루션이라고 하는데, 비즈니스에 중요한 데이터와 기능이 잠재적인 공격자에게 공개 될 수 있으며 기관이 통제하기 힘든 보안 방어를 해야만 한다.


[2] 웹 애플리케이션 보안

신기술이 늘 그렇듯 웹 애플리케이션도 새로운 영역의 보안 취약점을 함께 가져왔다.

웹 애플리케이션에게 가장 위험한 공격 :

  1. 중요한 데이터를 빼내는 것
  2. 애플리케이션이 실행되는 동안 백엔드 시스템에 제한 없이 접근하는 것


“이 사이트는 안전합니다.”

  • 대부분의 애플리케이션은 SSL을 사용하고 있기 때문에 안전하다는 문구를 내놓는다.

  • 기관들은 PCI(지불카드산업 - 정보보안 안전규정)표준을 준수하고 있어 안전하다는 문구를 내놓는다.

하지만 실제로 완벽하게 안전하지 않다.

일반적으로 알려진 종류의 취약점을 보유한 애플리케이션 비율

  • 인증실패(62%) - 로그인 메커니즘상의 다양한 취약점
  • 접근 통제 실패(71%) - 민감한 데이터, 기능에 대해 사용자 접근 통제 불가
  • SQL 인젝션(32%) - 조작된 입력 값을 제공해 DB 데이터 공격
  • 크로스사이트 스크립팅(94%) - 사용자에게 악의적인 공격 수행하게 하는 취약점
  • 정보 누출(78%) - 공격자가 공격을 위한 정보 수집
  • 크로스사이트 요청 위조(92%) - 사용자가 의도치 않은 행동을 수행


SSL은 매우 뛰어난 기술임에는 틀림지만, 애플리케이션 서버와 클라이언트 컴포넌트를 직접 공격하는 데에는 아무런 방어책이 되지 못한다.

-> 어떤 사이트에 SSL이 채택됐는지와 무관하게 사이트는 보안 결함을 내포한다.


보안 문제의 핵심

사용자가 임의의 입력 값을 제공할 수 있다.

웹 애플리케이션의 설계자나 개발자는 항상 사용자의 입력 값이 잠정적으로 위험할 수 있다고 가정해야 한다.

보안 문제점은 여러가지 방법으로 확인할 수 있다.

  • 클라이언트 쪽에 구현된 보안 장치는 쉽게 무력화될 수 있다.
  • 사용자가 개발자가 예상했던 절차대로 사용하지 않을 수 있다.
  • 사용자는 반드시 웹 브라우저 만을 사용하지 않는다. (브라우저가 생성하지 못하는 요청 값을 만들 수 있다.)
  • HTML 폼 필드에 보이지 않는 값으로 값을 변조할 수 있다.
  • HTTP쿠키 안에 포함돼 전달되는 세션 토큰을 조작할 수 있다.
  • 정상적으로 제공될 특정 값을 제거할 수 있다.
  • 악의적인 쿼리를 강제로 삽입해 입력 값을 조작할 수 있다.

SSL은 이와 같은 조작된 입력 값을 서버에 제공하는 것을 막지 못한다.

SSL은 네트워크 상에 있는 다른 사용자가 해당 통신 내용을 보거나 변조하지 못한다는 것만을 의미한다.


[3] 주요 문제점

1. 미성숙한 보안 의식

네트워크나 운영체제와 관련한 보안 취약점보다, 웹 애플리케이션 보안 문제에 대한 인식이 성숙한 편이 아니다.

웹 애플리케이션 개발자는 점점 더 많은 서드파티 패키지를 함께 적용할 줄 알아야하며, 근본적인 기술을 놓치지 않게 개발자의 역할이 커지고 있다.


2. 자체개발

대부분의 웹 애플리케이션은 해당 조직의 자체 인력 or 외주 비정규직 인력에 의해 개발된다.

이런 상황에서 모든 애플리케이션은 다른 곳과는 다른 고유한 결함을 갖게 된다.


3. 개발 간편화의 함정

(이 부분을 읽고 반성하게 되었다…)

요즘에는 초보 개발자라도 아주 강력한 애플리케이션을 단시간에 만들 수 있다.

그러다 작동되는 코드안전한 코드는 판이하게 다른 일이다.

많은 웹 애플리케이션이 보안 문제를 미리 예상할 지식이나 경험조차 없는 초보개발자들에 의해 만들어 지고 있다.

최근 동향은 이미 상용화된 코드 구성을 사용해 사용자 인증, 백엔드 인프라 구성 등의 다양한 기능을 다룬다.

이미 만들어진 코드를 사용하면 쉽고 빠르게 애플리케이션을 만들 수 있지만, 애플리케이션 작동에 대한 기술적인 이해와 잠재적인 위험성에 대해 무지해질 수 있다.


4. 빠르게 진화하는 위협 프로파일

웹 애플리케이션 공격과 방어에 대한 연구는 계속해서 빠른 속도로 발전한다.

특정 공격에 대해 이미 방어를 했더라도 새로운 공격 기술로 방어를 뚫을 수 있다.


5. 기능에 대한 요구 증가

애플리케이션은 기능과 용이성을 최우선시해 설계한다.

근래 웹사이트에서는 암호 복구, 암호 힌트, 암호를 컴퓨터에 저장 등 여러 기능이 추가 됐다.

이런 사이트에서는 다양한 보안 기술로 자신의 사이트가 안전하다고 하지만, 사실 다양한 방법으로 공격이 가능한 경우가 많다.


6. 자원과 시간 제약 요소

대부분의 웹 개발 프로젝트들은 시간과 자원의 부족에 쫓기게 된다. 그러니 시스템 설계나 개발에 전담 보안 전문가가 참여하기 어렵고 보안 테스트도 거의 이뤄지지 않는다.

=> 많은 시간 인내를 통해 확인 할 수 있는 매우 미묘하지만 중요한 취약점을 알려주지 못할 것이다.


7. 지나치게 학장돼 응용된 기술

웹 애플리케이션에 적용된 기능들은 원래 의도했던 목적보다 지나치게 학장돼 활용되고 있다. 이에 따라 예상치 못했던 부작용이 나타나고 결국 새로운 보안 취약점으로 귀결되고 있다.



여러 가지 웹 애플리케이션 보안의 증거에서 보이듯 이런 문제들이 획기적으로 해소되지 않고 남아있다.

웹 애플리케이션을 운영하는 기관이나 사용자에게나 웹 애플리케이션 공격은 중요한 위협으로 자리잡고있다.