파이썬 | Lynis를 통한 시스템 이익 및 규정 준수 보고

| | | | | | | | | | | |

Lynis는 유연하기 때문에 다양한 용도로 사용됩니다. Lynis의 일반적인 사용 사례는 다음과 같습니다.

  • 보안 감사
  • 준수 테스트(예: PCI, HIPAA, SOx)
  • 침투 테스트
  • 취약점 감지
  • 시스템 강화

시스템 보호 — 잠재적인 위협과 취약성으로부터 시스템을 보호합니다. Lynis를 사용하여 시스템의 다양한 위협 및 취약성에 대한 자세한 보고서를 생성할 수 있습니다. 그런 다음 사용자 또는 시스템 관리자는 시스템 보안을 위해 필요한 조치를 취할 수 있습니다.

Lynis 보고서는 읽기 어렵고 일반적으로 많은 정보를 포함합니다. 따라서 Bash 및 Python 스크립트를 사용하여 보고서를 구문 분석하고 보고서에서 경고, 제안과 같은 관련 정보를 추출하고 보고서로 Excel 파일에 저장합니다.

Lynis의 전제 조건 —

    Ubuntu, Mac Os 또는 기타 Linux 배포판과 같은 Linux/Unix 기반 OS를 실행 중이어야 합니다.

  • 복제하여 시스템에 Lynis를 설치합니다. github 저장소: https://github.com/CISOfy/lynis
  • 를 사용하여 pandas 라이브러리를 설치합니다. 명령 sudo pip3 install pandas .
  • 시스템에 Lynis를 설치한 후 Lynis라는 이름의 실행 파일과 함께 파일 세트가 있는 Lynis 디렉토리로 이동합니다.
  • bash 스크립트(아래 코드)를 사용하여 lynis 보고서에 제공된 경고 및 제안과 같은 관련 정보를 추출합니다. run.sh라는 파일을 만들고 bash 코드를 복사하여 해당 파일에 붙여넣고 sudo ./run.sh 를 입력하여 bash 스크립트를 실행합니다.
  • Python 스크립트(아래 코드 참조)를 실행하여 추출된 데이터를 정리 및 구문 분석하고 관련 정보를 Excel 파일로 출력합니다.

아래는 Bash 및 Python 스크립트 —

Script Bash:


#! / bin / bash


# 보고서 파일을 정리 / 구문 분석하는 스크립트 및
# 관련 세부 정보를 추출하고
# Python 스크립트를 실행하여 서버에 세부 정보를 표시합니다.

echo "실행 중 ......"

<코드 클래스 = "함수"> 에코 <코드 클래스 = "문자열"> ""

<코드 클래스 = "함수"> sudo <코드 클래스 = "일반">. / lynis 감사 시스템 --quick


# 경고를 실행합니다. sudo ./warnings.sh

echo "경고 생성"

<코드 클래스 = "함수"> 에코 <코드 클래스 = "문자열"> ""

<코드 클래스 = "함수"> 에코 "경고:"

echo ""


sudo 고양이 / var / log / lynis-report <코드 클래스 = "일반">. 닷 | grep 경고 | sed - e "s / 경고 [] = // g"

sudo 고양이 / var / log / lynis-report <코드 클래스 = "일반">. 닷 | grep 경고 | sed - e "s / 경고 [] = // g" <코드 클래스 = "일반"> | 고양이 > warnings.txt


에코 ""

echo "경고 생성"

echo "출력 파일: warnings.txt"


sudo chmod 755 경고 .txt


# 실행 제안. sudo ./suggestions.sh

echo "제안 생성"

<코드 클래스 = "함수"> 에코 <코드 클래스 = "문자열"> ""

<코드 클래스 = "함수"> 에코 "제안 사항:"

echo ""


sudo 고양이 / var / log / lynis-report <코드 클래스 = "일반">. 닷 | grep 제안 | sed - e "s / 제안 [] = // g"


sudo 고양이 / var / 로그 / lynis-report <코드 클래스 ="일반 ">. 닷 | grep 제안 | sed - e "s / 제안 [] = // g" <코드 클래스 = "일반"> | 고양이 > 제안.txt


에코 ""

echo "제안 생성"

echo <코드 클래스 = "문자열"> "출력 파일: 제안.txt"


sudo chmod 755개 제안 .txt



# 패키지를 실행합니다. sudo ./packages.sh

echo "패키지 생성"

<코드 클래스 = "함수"> 에코 <코드 클래스 = "문자열"> ""

<코드 클래스 = "함수"> 에코 "패키지는 다음과 같습니다."

echo ""


sudo 고양이 / var / log / lynis-report <코드 클래스 = "일반">. 닷 | <코드 클래스 = "함수"> grep <코드 클래스 = "일반"> 설치된 패키지 | sed - e "s / installed_package [] = // g"

sudo 고양이 / var / log / lynis-report <코드 클래스 = "일반">. 닷 | <코드 클래스 = "함수"> grep <코드 클래스 = "일반"> 설치된 패키지 | sed - e "s / installed_package [] = // g" <코드 클래스 = "일반"> | 고양이 > packages.txt


에코 ""

echo "패키지 생성"

sudo chmod 755 packages.txt



# 쉘을 실행합니다. sudo ./shells.sh

echo "사용 가능한 쉘 생성"

<코드 클래스 = "함수"> 에코 <코드 클래스 = "문자열"> ""

<코드 클래스 = "함수"> 에코 "쉘은 다음과 같습니다."

echo ""


<코드 클래스 = "함수"> sudo <코드 클래스 = "함수"> 고양이 <코드 클래스 = "일반"> / var / 로그 / lynis-report <코드 클래스 = "일반">. 닷 | grep available_shell | sed - e "s / available_shell [] = // g"

sudo 고양이 / var / log / lynis-report <코드 클래스 = "일반">. 닷 | grep available_shell | sed - e "s / available_shell [] = // g" <코드 클래스 = "일반"> | 고양이 > shells.txt


에코 ""

echo "쉘 생성"


echo "출력 파일: shells .txt "

<코드 클래스 ="함수 "> sudo <코드 클래스 = "함수"> chmod <코드 클래스 = "일반"> 755 shells.txt

Python 스크립트:


<표 테두리 = " 0 "cellpadding =" 0 "cellspacing =" 0 ">

# 라이브러리 가져오기

가져오기 pd로 판다

코드> <코드 클래스 = "일반"> 팬더 <코드 클래스 = "키워드"> 가져오기 <코드 클래스 = "일반"> ExcelWriter

<코드 class = "keyword"> import os


# 데이터를 가져오는 함수.

def get_data():


경고 = 열기 <코드 클래스="일반"> ( <코드 클래스 ="문자열 ">’ warnings.txt’ <코드 클래스 = "일반">, <코드 클래스 = " string"> ’r’ )

제안 = 열기 ( ’suggestions.txt’ < 코드 클래스 = "일반">, <코드 클래스 = "문자열"> ’r’ <코드 클래스 ="일반 ">)

<코드 클래스 = "plain"> 패키지 = 열기 ( < 코드 클래스 = "문자열"> ’패키지.txt’ <코드 클래스 ="일반 ">, <코드 클래스 ="문자열 " >’ r’ <코드 클래스 = "일반" >)

<코드 클래스 = "일반"> 쉘 <코드 클래스 = "키워드"> = 열기 ( ’shells.txt’ , <코드 클래스 ="문자열 ">’ r’ <코드 클래스 = "일반">)


<코드 class ="undefined space "> warn_data = warnings.readlines ()

sugg_data = 제안.readlines ()

pack_dat a = packages.read ( )

shell_data = <코드 클래스 = "일반"> shells.readlines ()


<코드 클래스 = "키 단어"> 반환 <코드 클래스 = "일반"> warn_data, sugg_data, pack_data, shell_data



<코드 클래스 = "keyword"> def clean_data ():


경고, 제안, 포장, 쉘 = get_data ()


warn_clean = []

for 라인 경고:

warn_clean.append (line.split ( ’|’ ) )


i 범위 ( len <코드 클래스 = "일반"> (warn_clean)):

<코드 클래스 = "일반"> warn_clean [i] <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> warn_clean [i] [: <코드 클래스 = "값"> 2 <코드 클래스 = "일반"> ]

# 인쇄(warn_clean [i])


sugg_clean = []

for line in sugg :

sugg_clean.append (line.split ( ’|’ ))


for i 범위 ( len (sugg_clean)):

sugg_clean [i] <코드 클래스 = "키워드"> = <코드 클래스 = "plai n "> sugg_clean [i] [: <코드 클래스 ="값 "> 2 ]

# 인쇄(sugg_clean [i])

pack_clean = []

= pack.split ( <코드 클래스 = "문자열"> ’|’ <코드 클래스 = "일반">)

<코드 클래스 = "일반 "> pack_clean = pack

< /코드> <코드 클래스 ="키워드 "> 델 <코드 클래스 ="일반 "> 팩_클린 [ <코드 클래스 = "값"> 0 <코드 클래스 = "일반">]

<코드 클래스 = "정의되지 않은 공백">

<코드 클래스 = "일반 "> shell_clean = []

i 범위 ( len (쉘):

shell_clean.append (쉘 [i] .rstrip ( ’’ ))

# 인쇄 (shell_clean [i])



반환 warn_clean, sugg_clean, pack_clean, shell_clean

def convert_to_excel ():


경고, 제안, 패키지, 쉘 = clean_data ()


시도 :

<코드 클래스 = "일반"> os.mkdir( <코드 클래스 = "문자열"> ’출력’ <코드 클래스 = "일반">)

제외 (예외):

통과

os.chdir ( ’출력’ )


warn_packages <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

<코드 클래스 = "일반" > 경고 xt = []

i 범위 ( len (경고)):

warn_packages.append (warnings [i] [ 0 ])


for i in 범위 ( len 경고)):

warn_text.append (경고 [i] [ < 코드 클래스 = "값"> 1 <코드 클래스 = "일반">])

인쇄 (warn_packages, warn_text)


경고 <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> pd.DataFrame()


<코드 클래스 = "일반"> 경고 [ ’패키지’ ] = warn_packages

warn [ ’경고’ ] <코드 클래스 ="키워드 "> = <코드 클래스 = "일반"> warn_text


<코드 클래스 = " 정의되지 않은 공백" > # warn.to_excel(& # 39; warnings.xlsx & # 39 ;, 인덱스 = False)


작성자 <코드 클래스 ="키워드 "> = <코드 클래스 = "일반"> ExcelWriter( <코드 클래스 = "문자열"> ’warnings.xlsx’ <코드 클래스 = "일반 ">)


warn.to_excel(작성자, <코드 클래스 ="문자열 ">’ 보고서1’ <코드 클래스 = "일반">, 색인 <코드 클래스 = "키워드"> = <코드 클래스 = "color1"> 거짓 )


통합 문서 = writer.book

워크시트 = <코드 클래스 = "일반"> 작성자. 시트 [ ’report1’ ]

# 송장 정보 열

workflow.set_column( <코드 클래스 = "문자열"> ’A: A’ <코드 클래스 ="일반 ">, <코드 클래스 = "값"> 15 <코드 클래스 = "일반" >)

# 상태 열

workflow.set_column( <코드 클래스 = "문자열"> ’B: B’ <코드 클래스 ="일반 ">, <코드 클래스 ="값 "> 45 <코드 클래스 ="일반 "> )

# 우편번호

# 워크시트.set_column(& # 39; F: F & # 39 ;, 10)


writer.save ()


<코드 클래스 = "일반"> sugg_packages <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

<코드 클래스 = "일반"> sugg_text <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> []

<코드 클래스 = "키워드 "> i 범위 ( len (제안)):

sugg_packages.append (제안 [i] [ 0 ])


for i in 범위 ( len (제안)): < / p>

sugg_text.append (제안 [i] [ 1 ])


# 인쇄(sugg_packages, sugg_te xt)


암시적인 = pd.DataFrame ()

제안 [ <코드 클래스 = "문자열"> ’패키지’ <코드 클래스 ="일반 ">] <코드 클래스 ="키워드 "> = <코드 클래스 ="일반 "> sugg_packages

[ ’제안’ ] = sugg_text


writer1 <코드 클래스 = "키워드" > = <코드 클래스 = "일반"> ExcelWriter( <코드 클래스 = "문자열"> ’suggestions.xlsx’ <코드 클래스 ="일반 ">)


<코드 클래스 = "일반"> sugg.to_excel(writer1, <코드 클래스 = "문자열"> ’보고서2’ < /코드> <코드 클래스 ="일반 ">, 색인 <코드 클래스 ="키워드 "> = <코드 클래스 s ="color1 " > False )


통합 문서 <코드 클래스 = "keyword"> = writer1.book

워크시트 = <코드 클래스 = "일반"> writer1.sheets [ <코드 클래스 = "문자열"> ’보고서2’ <코드 클래스 ="일반 ">]


# 송장 정보 열

< 코드 클래스 = "일반"> 워크시트.set_column( <코드 클래스 = "문자열"> ’A: A’ <코드 클래스 ="일반 ">, <코드 클래스 =" 값 "> 25 <코드 클래스 ="일반 ">)

<코드 클래스 = "주석"> # 상태 열

workstation.set_column( ’B: B’ , <코드 클래스 ="값 "> 120 <코드 클래스 = "일반">)

# 우편번호

# workflow.set_column(& # 39; F: F & # 39 ;, 10)

writer1.save()


팩_데이터 <코드 클래스 = "키워드"> = <코드 클래스="일반"> pd.DataFrame()

<코드 class ="undefined space "> pack_data [ ’ 패키지’ ] = 패키지

writer1 < 코드 클래스 = "키워드"> = <코드 클래스 = " 일반 "> ExcelWriter ( ’ packages.xlsx’ <코드 클래스 = "일반" >)


pack_data.to_excel (writer1, ’report3’ 코드 클래스 ="일반 ">, 색인 <코드 클래스 ="키워드 "> = <코드 클래스 ="color1 "> 거짓 <코드 클래스 = "일반">)

<코드 클래스 = "일반"> 통합 문서 <코드 클래스 = "키워드"> = writer1.book

워크시트 = writer1 .sheets [ ’report2’ ]

# 송장 정보 열

워크시트.set_column( <코드 클래스 = "문자열"> ’A: A’ <코드 클래스 ="일반 ">, <코드 클래스 ="값 "> 25 )

# 상태 열

<코드 클래스 = "일반"> 워크시트.set_column( <코드 클래스 = "문자열"> ’B: B’ <코드 클래스 ="일반 ">, 120 )

# 우편번호

# 워크시트.set_column(& # 39; F: F & # 39 ;, 10)

writer1.save ()

이 문서가 문제를 해결하는 데 도움이 되었기를 바랍니다. 파이썬 | Lynis를 통한 시스템 이익 및 규정 준수 보고 외에 다른 __del__ 관련 주제를 확인하세요.

파이썬에서 뛰어나고 싶으십니까? 2022최고의 Python 온라인 과정에 대한 검토를 참조하세요. 데이터 과학에 관심이 있다면 R로 프로그래밍을 배우는 방법도 확인하세요.

그런데 이 자료는 다른 언어로도 제공됩니다.



Boris Danburry

Rome | 2022-11-29

간단하고 명확하게. 공유해 주셔서 감사합니다. 파이썬 | Lynis를 통한 시스템 이익 및 규정 준수 보고 및 rstrip의 기타 문제는 항상 저의 약점이었습니다 😁. 더 이상 나타나지 않기를 바랄뿐입니다

Angelo Nickolson

London | 2022-11-29

간단하고 명확하게. 공유해 주셔서 감사합니다. 파이썬 | Lynis를 통한 시스템 이익 및 규정 준수 보고 및 system의 기타 문제는 항상 저의 약점이었습니다 😁. 내 학사 논문에 사용할 것입니다

Anna Robinson

Prague | 2022-11-29

sin은(는) 모든 것이 약간 혼란스럽습니다 😭 파이썬 | Lynis를 통한 시스템 이익 및 규정 준수 보고이(가) 만난 유일한 문제는 아닙니다.. 어제 확인했는데 작동합니다!

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

Common xlabel/ylabel for matplotlib subplots

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?

12 answers

NUMPYNUMPY

Flake8: Ignore specific warning for entire file

12 answers

NUMPYNUMPY

glob exclude pattern

12 answers

NUMPYNUMPY

How to avoid HTTP error 429 (Too Many Requests) python

12 answers

NUMPYNUMPY

Python CSV error: line contains NULL byte

12 answers

NUMPYNUMPY

csv.Error: iterator should return strings, not bytes

12 answers


Wiki

Python | How to copy data from one Excel sheet to another

Common xlabel/ylabel for matplotlib subplots

Check if one list is a subset of another in Python

sin

How to specify multiple return types using type-hints

exp

Printing words vertically in Python

exp

Python Extract words from a given string

Cyclic redundancy check in Python

Finding mean, median, mode in Python without libraries

cos

Python add suffix / add prefix to strings in a list

Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?

Python - Move item to the end of the list

Python - Print list vertically