오래된 종이 문서를 파쇄하는 것처럼, 디지털 데이터도 안전하게 폐기해야 합니다. 리눅스 환경에서 파일을 확실하게 삭제하는 방법을 알아보겠습니다. 이 튜토리얼에서는 ‘shred’ 명령어와 ‘secure-delete’ 유틸리티 모음을 사용하여 데이터 보안을 강화하는 방법을 살펴봅니다.
삭제된 파일, 복구 가능성이 있다
파일을 삭제하는 행위는 일반적으로 하드 드라이브에서 해당 데이터를 완전히 제거하는 것을 의미하지 않습니다. 파일 시스템은 ‘inode’라는 데이터 구조를 사용하여 파일 정보를 관리합니다. inode에는 파일 이름, 물리적 저장 위치, 속성, 권한 등 파일에 대한 메타데이터가 저장됩니다. 디렉토리 또한 파일의 일종으로, 해당 디렉토리에 포함된 파일들의 이름과 inode 번호를 저장하는 역할을 합니다.
‘rm’ 명령어를 사용하여 파일을 삭제하면, 파일 시스템은 해당 파일의 inode를 해제하고 디렉토리 정보를 수정합니다. 이는 해당 파일이 사용하던 하드 드라이브 공간을 ‘사용 가능’ 상태로 표시하는 것입니다. 마치 도서관에서 책의 카탈로그 카드를 찢어버리는 것과 같습니다. 책 자체는 여전히 책장에 있지만, 찾기가 어려워집니다.
즉, 삭제된 파일이 차지했던 공간은 다른 파일에 의해 덮어쓰일 수 있게 되지만, 이전 파일의 데이터 자체는 여전히 해당 공간에 남아 있습니다. 따라서, 해당 공간이 다른 데이터로 덮어쓰여지기 전까지는 삭제된 파일을 복구할 가능성이 존재합니다.
하지만, 파일을 완전히 제거하는 과정은 단순하게 덮어쓰는 것보다 복잡합니다. 이제 그 이유를 자세히 알아보겠습니다.
SSD에서는 이러한 방법 사용 금지
이 글에서 설명하는 기술은 기존의 기계식 하드 디스크 드라이브(HDD)에 적용되며, 솔리드 스테이트 드라이브(SSD)에는 사용해서는 안 됩니다. SSD에 이러한 방법을 적용하면 효과가 없을 뿐만 아니라, 불필요한 쓰기 작업으로 인해 SSD의 수명을 단축시킬 수 있습니다. SSD에서 데이터를 안전하게 삭제하려면 해당 SSD 제조사에서 제공하는 별도의 유틸리티를 사용하는 것이 좋습니다.
‘shred’ 명령어
‘shred’ 명령어는 데이터를 덮어쓰는 방식으로 삭제된 파일을 복구 불가능하게 만드는 데 특화되어 있습니다. 이 명령어는 Ubuntu, Fedora, Manjaro 등 대부분의 리눅스 배포판에 기본적으로 포함되어 있습니다.
예를 들어, ‘~/research’라는 디렉토리 안에 여러 텍스트 파일과 다른 디렉토리들이 있다고 가정해 보겠습니다. 이러한 파일들은 중요하므로 하드 드라이브에서 완전히 제거해야 합니다.
‘tree -d’ 명령어를 사용하여 디렉토리 구조를 확인할 수 있습니다. ‘-d’ 옵션은 파일이 아닌 디렉토리만 표시하도록 합니다.
tree -d
단일 파일 ‘shred’
단일 파일을 ‘shred’하려면 다음과 같은 명령어를 사용할 수 있습니다. 사용되는 옵션은 다음과 같습니다.
u: 덮어쓰기 후 파일 할당을 해제하고 제거합니다.
v: 자세한 정보 표시 모드로, shred가 수행하는 작업을 보여줍니다.
z: 0으로 최종 덮어쓰기를 수행합니다.
shred -uvz Preliminary_Notes.txt_01.txt
기본적으로 ‘shred’는 파일을 4번 덮어씁니다. 처음 세 번은 임의의 데이터로, 마지막 한 번은 0으로 덮어씁니다. 그런 다음 파일을 삭제하고 inode의 메타데이터를 덮어씁니다.
덮어쓰기 횟수 설정
‘-n(숫자)’ 옵션을 사용하여 ‘shred’가 수행할 덮어쓰기 횟수를 변경할 수 있습니다. ‘shred’는 최소 한 번의 덮어쓰기를 수행하며, ‘-n’ 옵션으로 지정하는 숫자는 추가로 수행할 덮어쓰기 횟수입니다. 따라서 총 3번의 덮어쓰기를 수행하려면 ‘-n 2’를 사용합니다.
shred -uvz -n 2 Preliminary_Notes.txt_02.txt
예상대로, shred는 세 번의 덮어쓰기를 수행합니다.
덮어쓰기 횟수를 줄이면 작업 속도가 빨라지지만, 그만큼 보안성이 낮아질 수 있습니다. 그러나 실제로 세 번의 덮어쓰기만으로도 충분히 안전하다고 볼 수 있습니다.
여러 파일 ‘shred’
와일드카드를 사용하여 여러 파일을 동시에 ‘shred’할 수 있습니다. ‘*’는 여러 문자를, ‘?’는 단일 문자를 나타냅니다. 다음 명령어는 현재 작업 디렉토리에 있는 ‘Preliminary_Notes’로 시작하는 모든 파일을 삭제합니다.
shred -uvz -n 2 Preliminary_Notes_*.*
각 파일은 차례대로 ‘shred’에 의해 처리됩니다.
하지만 ‘shred’ 명령어에는 재귀적인 옵션이 없으므로, 중첩된 디렉토리 구조를 한 번에 삭제하는 데는 사용할 수 없습니다.
파일 보안 삭제의 한계
‘shred’ 명령어는 유용하지만, 몇 가지 한계점이 있습니다. Ext3, Ext4와 같은 최신 저널링 파일 시스템은 데이터 손실이나 손상을 방지하기 위해 많은 노력을 기울입니다. 이러한 저널링 파일 시스템에서는 ‘shred’ 명령어를 사용하더라도 삭제된 파일이 사용했던 하드 드라이브 영역에 덮어쓰기가 실제로 이루어지지 않을 수 있습니다.
‘rm’ 명령어를 사용하는 것보다 조금 더 확실하게 파일을 삭제하고 싶다면 ‘shred’ 명령어를 사용할 수 있습니다. 하지만 데이터가 완전히 사라졌고 복구할 수 없다고 확신해서는 안 됩니다. 복구 가능성이 여전히 존재할 수 있습니다.
‘secure-delete’ 유틸리티 모음
‘secure-delete’ 유틸리티 모음은 저널링 파일 시스템의 한계를 극복하고 파일을 보다 안전하게 덮어쓰는 데 사용됩니다. 하지만, 앞서 언급한 것처럼, 덮어쓰기가 실제로 데이터가 저장되었던 하드 드라이브 영역에서 정확하게 발생한다는 보장은 여전히 없습니다. 다만, 덮어쓰기가 성공할 가능성을 높여주는 것은 사실입니다.
‘secure-delete’ 명령어는 다음과 같은 일련의 덮어쓰기 및 작업을 수행합니다.
1. 0xFF 값으로 덮어쓰기.
2. 임의의 데이터로 5번 덮어쓰기.
3. Peter Gutmann이 정의한 특수 값으로 27번 덮어쓰기.
4. 임의의 데이터로 5번 더 덮어쓰기.
5. 파일 이름을 임의의 값으로 변경.
6. 파일 크기를 0으로 줄이기.
이 과정이 과도하다고 생각될 수도 있지만, 이는 데이터 보안을 위한 일련의 조치입니다. 실제로 오클랜드 대학교의 Peter Gutmann 교수도 1996년 논문에서 이러한 기술을 논의하면서, 모든 기술을 한 번에 사용할 필요는 없다고 주장했습니다. 그는 이후 “임의의 데이터를 사용한 적절한 덮어쓰기만으로도 충분할 수 있다.”라고 덧붙였습니다.
하지만 현재 ‘secure-delete’ 유틸리티에서는 이러한 기술들을 사용하여 데이터 보안을 강화합니다. 이 유틸리티를 사용하기 위해서는 먼저 설치해야 합니다.
‘secure-delete’ 설치
Ubuntu 또는 Debian 기반 배포판을 사용하는 경우 ‘apt-get’ 명령어를 사용하여 ‘secure-delete’ 패키지를 설치할 수 있습니다. 다른 리눅스 배포판에서는 해당 배포판의 패키지 관리 도구를 사용하십시오.
sudo apt-get install secure-delete
‘secure-delete’ 패키지에는 다음과 같은 네 가지 명령어가 포함되어 있습니다.
- srm: 파일을 삭제하고 하드 드라이브 공간을 덮어쓰는 보안 ‘rm’ 명령어
- sfill: 하드 드라이브의 모든 여유 공간을 덮어쓰는 도구
- sswap: 스왑 공간을 덮어쓰고 정리하는 도구
- sdmem: RAM을 정리하는 데 사용되는 도구
‘srm’ 명령어
‘srm’ 명령어는 ‘rm’ 명령어와 유사하게 사용됩니다. 단일 파일을 삭제하려면 다음 명령어를 사용합니다. ‘-z’ 옵션은 최종 삭제 시 임의의 데이터 대신 0을 사용하도록 하며, ‘-v’ 옵션은 ‘srm’이 진행 상황을 자세히 보여주도록 합니다.
srm -vz Chapter_One_01.txt
가장 먼저 알 수 있는 것은 ‘srm’ 명령어가 ‘shred’ 명령어보다 느리다는 것입니다. 하지만 작업을 수행하는 동안 시각적인 피드백을 제공하므로, 완료되었을 때 안도감을 느낄 수 있습니다.
‘-l’ (보안 완화) 옵션을 사용하여 덮어쓰기 횟수를 2로 줄여 작업 속도를 크게 높일 수 있습니다.
srm -lvz Chapter_One_02.txt
‘srm’은 이 방법이 보안성이 다소 떨어질 수 있지만, 여전히 파일을 삭제하고 덮어쓰는 데 효과적이라고 알려줍니다.
‘-l’ 옵션을 두 번 사용하여 덮어쓰기 횟수를 한 번으로 줄일 수도 있습니다.
srm -llvz Chapter_One_03.txt
여러 파일과 함께 ‘srm’ 사용
와일드카드를 사용하여 여러 파일을 동시에 ‘srm’할 수도 있습니다. 다음 명령어는 ‘Chapter_One’으로 시작하는 나머지 파일들을 삭제합니다.
srm -vc Chapter_One_0?.txt
파일은 ‘srm’에 의해 차례대로 처리됩니다.
‘srm’으로 디렉토리와 그 내용 삭제
‘-r’ (재귀적) 옵션을 사용하여 ‘srm’이 모든 하위 디렉토리와 해당 내용을 삭제하도록 할 수 있습니다. ‘srm’에 디렉토리 경로를 전달하면 됩니다.
다음 예에서는 현재 디렉토리인 ‘~/research’를 모두 삭제합니다. 즉, ‘~/research’의 모든 파일과 하위 디렉토리가 안전하게 제거됩니다.
srm -vz *
‘srm’은 디렉토리와 파일 처리를 시작합니다.
결국 명령 프롬프트로 돌아오게 됩니다. 이 문서에서 사용된 테스트 환경에서는 현재 디렉토리와 3개의 하위 디렉토리, 그리고 약 200개의 파일을 삭제하는 데 약 1시간이 걸렸습니다.
모든 파일과 하위 디렉토리가 예상대로 제거되었습니다.
‘sfill’ 명령어
‘rm’ 명령어를 사용하여 삭제한 파일들이 걱정된다면, ‘sfill’ 명령어를 사용하여 하드 드라이브의 모든 여유 공간을 덮어쓸 수 있습니다.
이 명령어를 실행하면 하드 드라이브의 여유 공간이 점점 줄어들고 결국 여유 공간이 전혀 남지 않게 됩니다. 덮어쓰기가 완료되면 모든 여유 공간이 다시 사용자에게 해제됩니다. 다중 사용자 시스템을 관리하는 경우, 이 작업은 시간이 많이 걸리므로 사용자가 적은 시간에 실행하는 것이 좋습니다.
개인 컴퓨터에서도 하드 드라이브 공간이 부족해지므로, ‘sfill’ 명령어를 실행한 후에는 컴퓨터를 그대로 두는 것이 좋습니다.
속도를 조금 더 높이려면 ‘-l’ (보안 완화) 옵션을 사용할 수 있습니다. 이전과 마찬가지로 ‘-v’ (자세한 정보) 및 ‘-z’ (영) 옵션도 사용할 수 있습니다. 다음은 ‘/home’ 디렉토리의 모든 여유 공간을 안전하게 덮어쓰도록 요청하는 예시입니다.
sudo sfill -lvz /home
이 작업은 시간이 오래 걸립니다. 10GB 하드 드라이브를 사용한 테스트 환경에서는 오후에 시작하여 다음날 아침이 되어서야 완료되었습니다.
오랜 시간 동안 작동한 후, 명령 프롬프트로 돌아오게 됩니다.
‘sswap’ 명령어
‘sswap’ 명령어는 스왑 파티션의 저장 공간을 덮어씁니다. 가장 먼저 해야 할 일은 스왑 파티션을 식별하는 것입니다. ‘blkid’ 명령어를 사용하여 블록 장치를 나열하여 이를 확인할 수 있습니다.
sudo blkid
결과에서 ‘swap’이라는 단어를 찾아, 해당 단어가 연결된 블록 장치를 기록해 둡니다.
위의 이미지에서는 스왑 파티션이 ‘/dev/sda5’에 연결된 것을 확인할 수 있습니다.
덮어쓰기 작업 중에는 스왑 파티션에 대한 디스크 쓰기를 중단해야 합니다. ‘swapoff’ 명령어를 사용합니다.
sudo swapoff /dev/sda5
이제 ‘sswap’ 명령어를 사용할 수 있습니다.
명령줄에 ‘/dev/sda5’를 포함하여 ‘sswap’ 명령어를 실행합니다. ‘-v’ (자세한 정보) 및 ‘-ll’ (보안 완화) 옵션도 함께 사용합니다.
sudo sswap -llv /dev/sda5
‘sswap’은 스왑 파티션을 덮어쓰기 시작하며, 생각보다 빨리 작업이 완료됩니다.
작업이 완료되면 스왑 파티션을 다시 활성화해야 합니다. ‘swapon’ 명령어를 사용합니다.
sudo swapon /dev/sda5
‘sdmem’ 명령어
‘secure-delete’ 패키지에는 컴퓨터의 RAM (Random Access Memory)을 지우는 도구도 포함되어 있습니다.
콜드 부트 공격은 컴퓨터가 꺼진 직후 컴퓨터에 물리적으로 접근하여 RAM 칩에서 데이터를 추출하는 것을 의미합니다.
만약 이러한 유형의 공격으로부터 자신을 보호해야 한다고 생각한다면, 컴퓨터를 끄기 전에 RAM을 정리할 수 있습니다. 이때 ‘-v’ (자세한 정보) 및 ‘-ll’ (보안 완화) 옵션을 사용합니다.
sudo sdmem -vll
터미널 창은 ‘sdmem’이 RAM을 덮어쓰는 과정을 나타내는 별표로 가득 차게 됩니다.
더 쉬운 방법: 드라이브 암호화
파일을 안전하게 삭제하는 대신 하드 드라이브 또는 홈 폴더를 암호화하여 보호하는 것은 어떨까요?
이렇게 하면 라이브 파일이든 삭제된 파일이든 누구도 데이터에 액세스할 수 없게 됩니다. 또한 모든 파일이 암호화되어 있으므로, 민감한 파일을 안전하게 삭제해야 한다는 부담감에서 벗어날 수 있습니다.
대부분의 Linux 배포판은 설치 과정에서 암호화 사용 여부를 묻습니다. “예”라고 대답하면 미래에 발생할 수 있는 많은 문제를 예방할 수 있습니다. 또한, 컴퓨터를 사용한 후 다른 사람에게 양도하거나 판매할 경우에도 암호화를 사용하면 작업이 훨씬 간단해집니다.