Shell - md5sum hash key를 이용한 파일 무결성 검증

System Story/CentOS 5,6 2014.05.14 13:39

시스템을 운영하다 보면 Data의 복제 이전, Disk Volume의 구조 변경등 Filesystem 이하에 생성된 파일들에 대해서 무결성 검증이 필요할 경우가 있다.

 

리눅스 시스템에는 이럴때 유용하게 사용할 수 있는 md5 hash 알고리즘을 이용한 Hash key 생성 유틸리티가 존재한다.

 

따라서 아래와 같이 적절한 Shell Script의 응용과 함께 md5sum을 이용하면 작업 전,후의 파일레벨 무결성을 검증하는데 큰 도움이 된다.

 

 

1. 검증 알고리즘

- Hash 알고리즘 MD5 기반 md5sum 명령을 기반으로한 Shell script를 통해 작업 전후 대상에 대한 파일 체크섬 생성후 비교 검증

 

2. 적용가능 케이스

 1) 구조변경 작업등 특정 Volume영역에 대한 파일 레벨 무결성 검증
 2) Backup
Restore 시 원본 파일과 Restore 파일의 무결성 검증
 3)
네트워크 레벨 또는 Local COPY를 통한 파일 복제 및 전송후 무결성 검증등

 

3. Shell Script 실행 예시

 

1) Parameter(인자값) 없이 스크립트 실행시 아래와 같이 사용방법이 표기됨.

[root@t-node01 shell]#
[root@t-node01 shell]# ./create_checksum.sh
Usage1 - ./create_checksum.sh [Check DIR]
ex1) - ./create_checksum.sh /data/backup
Usage2 - ./create_checksum.sh [Check DIR] [Checksum File Name]
ex2) - ./create_checksum.sh /data/backup chksum.result
[root@t-node01 shell]#
[root@t-node01 shell]#
[root@t-node01 shell]# 

 

 

 

2) 검증할 File 또는 Directory 의 절대 경로 입력하여 Shell Script 실행

[root@t-node01 shell]#

[root@t-node01 shell]#
[root@t-node01 shell]# ./create_checksum.sh /home
/home Source Count is - 291
Create Checksum File - /root/chksum/20140417_192138_chksum.md5
[ MD5 Hash KEY ] [ Source File ]
06577ad194f3e671d6c5b88d6b925f10 /home/test/.emacs
d41d8cd98f00b204e9800998ecf8427e /home/test/aaa28
0992fa693601dae975bfe02958d0f241 /home/test/.bash_history
d41d8cd98f00b204e9800998ecf8427e /home/test/bbb
f119c865306c35e64eb00f65d7279664 /home/test/.bashrc
d41d8cd98f00b204e9800998ecf8427e /home/test/ccc
084a1a5de99b4e9ec2bc6b029d9a6b2a /home/test/.bash_logout
3e8337f44f84b298a8a99869ae8ca76a /home/test/.bash_profile
06577ad194f3e671d6c5b88d6b925f10 /home/helperchoi/.emacs
c135655d4caad5aa3d3ce1ba2e4f666a /home/helperchoi/.bash_history
38791c8d9291a735c763dbee7bbd986c /home/helperchoi/설치파일(압축해제).zip
f5f0bc8dea817df6feba6ae1fd49712b /home/helperchoi/.viminfo
ea9cee578f812a57ba2e8883a6788e38 /home/helperchoi/tcounist-alkanfel.exe
.
.
.
생략
.
.
97279de6734ddb049bcb5a4e94118405 /home/helperchoi/strace
f119c865306c35e64eb00f65d7279664 /home/helperchoi/.bashrc
084a1a5de99b4e9ec2bc6b029d9a6b2a /home/helperchoi/.bash_logout
3e8337f44f84b298a8a99869ae8ca76a /home/helperchoi/.bash_profile
34d7c793579ce8209356a1b12e0a2854 /home/helperchoi/scptest.txt
ecbe38946e848f44ddedda9f708a88eb /home/helperchoi/list2
[root@t-node01 shell]#
[root@t-node01 shell]#
[root@t-node01 shell]#

 


 

3) Test 예제를 위해 아래와 같이 특정 파일에 내용을 변경하였음.

[root@t-node01 shell]#
[root@t-node01 shell]# cat /home/helperchoi/list2
1111 1111
aaaa bbbb
cccc dddd
aaaa bbbb
cccc aaaa
[root@t-node01 shell]#
[root@t-node01 shell]#
[root@t-node01 shell]# echo "2222 3333" >> /home/helperchoi/list2
[root@t-node01 shell]#
[root@t-node01 shell]# 

 

 

4) 작업 완료등을 가정하고(검증 단계) 해당 영역에 대한 Script 재수행하여 검증할 checksum 파일 생성

[root@t-node01 shell]#

[root@t-node01 shell]#
[root@t-node01 shell]# ./create_checksum.sh /home
/home Source Count is - 291
Create Checksum File - /root/chksum/20140417_192438_chksum.md5
[ MD5 Hash KEY ] [ Source File ]
06577ad194f3e671d6c5b88d6b925f10 /home/test/.emacs
d41d8cd98f00b204e9800998ecf8427e /home/test/aaa28
0992fa693601dae975bfe02958d0f241 /home/test/.bash_history
d41d8cd98f00b204e9800998ecf8427e /home/test/bbb
f119c865306c35e64eb00f65d7279664 /home/test/.bashrc
d41d8cd98f00b204e9800998ecf8427e /home/test/ccc
084a1a5de99b4e9ec2bc6b029d9a6b2a /home/test/.bash_logout
3e8337f44f84b298a8a99869ae8ca76a /home/test/.bash_profile
06577ad194f3e671d6c5b88d6b925f10 /home/helperchoi/.emacs
c135655d4caad5aa3d3ce1ba2e4f666a /home/helperchoi/.bash_history
38791c8d9291a735c763dbee7bbd986c /home/helperchoi/설치파일(압축해제).zip
f5f0bc8dea817df6feba6ae1fd49712b /home/helperchoi/.viminfo
ea9cee578f812a57ba2e8883a6788e38 /home/helperchoi/tcounist-alkanfel.exe
.
.
.
생략
.
.
.
97279de6734ddb049bcb5a4e94118405 /home/helperchoi/strace
f119c865306c35e64eb00f65d7279664 /home/helperchoi/.bashrc
084a1a5de99b4e9ec2bc6b029d9a6b2a /home/helperchoi/.bash_logout
3e8337f44f84b298a8a99869ae8ca76a /home/helperchoi/.bash_profile
34d7c793579ce8209356a1b12e0a2854 /home/helperchoi/scptest.txt
8c6bba209a15c715bdb853d7782a3dae /home/helperchoi/list2
[root@t-node01 shell]#

 

 

5) Checksum 파일이 생성되는 경로로 이동후 diff 명령을 통한 차이 비교
-
아래와 같이 검증대상 전체 291개 파일중 테스트 예제로 내용을 변경한 1개의 파일에 대해서 CheckSUM Hash 값이 다르는 것을 파악할 수 있으며 해당 파일이 변경되었음을 알 수 있음.

[root@s-node01 /]#

[root@s-node01 /]#
[root@s-node01 /]# cd /root/chksum
[root@s-node01 chksum]#
[root@s-node01 chksum]# ls -l
합계 56
-rw-r--r-- 1 root root 28151 4 17 19:21 20140417_192138_chksum.md5
-rw-r--r-- 1 root root 28151 4 17 19:24 20140417_192438_chksum.md5
[root@s-node01 chksum]#
[root@s-node01 chksum]#
[root@s-node01 chksum]# diff 20140417_192138_chksum.md5 20140417_192438_chksum.md5
291c291
< ecbe38946e848f44ddedda9f708a88eb /home/helperchoi/list2
---
> 8c6bba209a15c715bdb853d7782a3dae /home/helperchoi/list2
[root@s-node01 chksum]#
[root@s-node01 chksum]#
[root@s-node01 chksum]#
[root@s-node01 chksum]#

 

 

 

4. Shell Script Code

 

[root@t-node01 shell]#

[root@t-node01 shell]#
[root@t-node01 shell]# vi ./create_checksum.sh
#!/bin/bash
#By Kwangmin Choi (kwangmin.choi@kt.com)

 

find $1 -type f > /tmp/object.list
LIST_FILE=/tmp/object.list
RESULT_DIR=/root/chksum
mkdir -p ${RESULT_DIR}
CHECK_COUNT=`find $1 -type f | wc -l`

 

if [ $# -eq 1 ]
then
 CHKSUM_FILE=${RESULT_DIR}/`date +%Y%m%d_%H%M%S`_chksum.md5

 rm -f ${CHKSUM_FILE}
 echo "$1 Source Count is - ${CHECK_COUNT}"
 echo "Create Checksum File - ${CHKSUM_FILE}"
 echo

 echo -e "[ MD5 Hash KEY ]             \t[ Source File ]"
 while read LIST
 do
  md5sum "${LIST}" >> ${CHKSUM_FILE}
 done < ${LIST_FILE}
 cat ${CHKSUM_FILE}

elif [ $# -eq 2 ]
then
 USER_CHKSUM_FILE=${RESULT_DIR}/`date +%Y%m%d_%H%M%S`_$2

 if [ -e "${USER_CHKSUM_FILE}" ]
 then
  rm -f ${USER_CHKSUM_FILE}
  echo "$1 Source Count is - ${CHECK_COUNT}"
  echo "Create Checksum File - ${USER_CHKSUM_FILE}"
  echo

  echo -e "[ MD5 Hash KEY ]             \t[ Source File ]"
  while read LIST
  do
   md5sum "${LIST}" >> ${USER_CHKSUM_FILE}
  done < ${LIST_FILE}
  cat ${USER_CHKSUM_FILE}
 else
  echo "$1 Source Count is - ${CHECK_COUNT}"
  echo "Create Checksum File - ${USER_CHKSUM_FILE}"
  echo

  echo -e "[ MD5 Hash KEY ]             \t[ Source File ]"
  while read LIST
  do
   md5sum "${LIST}" >> ${USER_CHKSUM_FILE}
  done < ${LIST_FILE}
  cat ${USER_CHKSUM_FILE}
 fi
else
 echo
 echo "Usage1 - $0 [Check DIR]"
 echo "ex1) - $0 /data/backup"
 echo
 echo "Usage2 - $0 [Check DIR] [Checksum File Name]"
 echo "ex2) - $0 /data/backup chksum.result"
 echo
 exit 0
fi 

[root@t-node01 shell]#
[root@t-node01 shell]#
[root@t-node01 shell]#


 

Trackbacks 0 : Comments 0

Write a comment