반응형

파일의 무결성 체크방법은 여러 가지가 있습니다. 무결성을 체크하는 이유역시 다양하지만 대부분은 파일이 임의로 변경이 되었는지를 확인 검증하기위해서 사용합니다. 무결성 검증하는 프로그램들이 이미 있기 때문에 설치해서 사용해도 되지만 직접 만들어서 사용해보도록 하겠습니다.

 

일단, 무결성을 어떻게 체크 할 것인가가 문제입니다. 무결성은 파일의 내용이 변경이 되었는지 확인하면 됩니다. 하지만 무결성 대상 파일이 바이너리 파일인 경우는 변경이 된 것 파일의 내용으로 확인할 수 없습니다.

 

 

다음의 기준으로 무결성 검증을 진행 

  1. 대상파일가 지정된 위치에 있는지 확인
  2. 대상 파일의 크기가 변경이 되었는지 확인
      private boolean targetFileAdd(List<File> fileList, String dirPath, String extList) {
            
            File dir = new File(dirPath);
            if ( dir.exists() == false ) {                  
                  return false;
            }
            String[] arrexts = null;
            if (extList.equals("*") == false) {
                  arrexts = extList.split(",");
            }
            Collection<File> files = FileUtils.listFiles(dir, arrexts, true);
            fileList.addAll(files);
            return true;
      }

 

우선 대상 파일을 선장하여 List에 추가합니다. 아파치의 FileUtils를 사용해 지정된 경로의 파일들을 Collection에 추가합니다. 다음과 같이 파라미터를 설정하면 됩니다. 

 

targetFileAdd(fileList, "/root/test/","*");

targetFileAdd(fileList, "/root/test/", "txt,sh");

 

전체 파일 수집할 경우는 * 를 사용하고 특정 파일만 사용하는 경우는 "txt, sh"처럼 확장자를 입력하거나 파일 명을 입력하여 사용하면 됩니다.

 

 

특정 파일만 제외 해야 하는 경우 

targetFileAdd 함수를 호출할 때 해당 파일이나 경로를  필터링하면 좋을 것 같습니다. 하지만 여기서는 그렇게 수행하지 않고 이미 수집 한 파일 리스트에서 제거하는 방식을 선택했습니다.

      private Map<String, String> skipFileMap = new HashMap<String, String>();
      
      public Map<String, String> initSkipFileMap(Map<String, String> map) {
            if(map == null) {
                  skipFileMap.put("node.txt", "OFF");
                  skipFileMap.put("node.sh", "OFF");
                  skipFileMap.put("nodeconfig.sh", "OFF");
                  skipFileMap.put("mongo.sh", "OFF");
                  skipFileMap.put("text.txt", "OFF");
                  skipFileMap.put("casandra.txt", "OFF");
            } else {
                  skipFileMap = map;
            }
      }
      
      private List<File> reneFileLIst(List<file> fileList) {
            List<File> fList= new ArrayList<File>();
            for(File file : fileList) {
                  try {
                        if(skipFileMap.get(file.getName()).equals("OFF"))
                              continue;
                        
                        fList.add(file);
                  } catch(Exception e) {
                        
                  }
            }
            
            return fList;
      }

 

제외 대상 파일들을 skipFileMap에 저장하고 전체 리스트에서 대상이 아닌 파일에 대해서 삭제합니다. 전체 목록을 만들고 삭제하는 이유는 목록을 만드는 과정에서 삭제해도 되지만 나중에 이미 만들어진 파일에서 필터링을 해야 하는 경우가 발생할 수 있을 것 같아서 이 방식을 선택했습니다.

 

 

다음으로 목록의 파일들을 getHashData 함수를 이용해 해시 파일을 생성합니다. 여기서는 sah256으로 해시를 생성했습니다. 

    private List<String> generateHashFiles(List<File> fileList) {
            List<String> hashFileList = new ArrayList<String>();
            for (int i=0; i < fileList.size(); i++)
            {
                  File file = fileList.get(i);
                  String hashData = getHashData(file);
                  if (hashValue == null) {
                        continue;
                  }
                  String item = file.getName() + "|" + hashData;
                 hashFileList.add(item);
            }
            returnhashFileList;
      }

      public String getHashData(File file) {
            BufferedInputStream fis = null;
            try {
                  fis = new BufferedInputStream(new FileInputStream(file));
                  return DigestUtils.sha256Hex(fis);
            } catch (IOException e) {
                  logger.error(e, e);
            } finally {
                  IOUtils.closeQuietly(fis);
            }
            return null;
      }

DBMS를 사용한다면 파일 정보와 해시값을 별도의 칼럼에 저장할 수 있겠지만 DBMS를 사용하지 않기 때문에 | 로 구분하여 txt 파일로 저장하겠습니다. 파일 저장이 완료되었다면  이후에 이 파일로 파일들이 변경되었는지 확인이 가능하며 확인 결과를 알림이나 로그로 기록할 수 있습니다.

 

무결성 파일 검증은 위 과정과 비슷합니다.  대상 파일의 해시값을 만들고 위에서 생성한 파일의 해시값과 비교를 합니다. 그래서 해시값이 변경되었다면 다른 파일로 판단할 수 있겠습니다.

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기