저는 현재 Thunderbird와 gnupg를 사용하여 암호화된 이메일을 읽고 있습니다. 스와핑 동작을 올바르게 이해하면 해독된 이메일이 포함된 메모리 페이지를 스와핑하여 하드 드라이브에 흔적을 남길 수 있으며 이론적으로 나중에 법의학을 통해 복구할 수 있습니다.
암호화된 스왑 파일을 사용하거나 중요한 파일을 사용하는 동안 전역적으로 스왑을 비활성화하는 것은 확실히 가능하지만 성능에 영향을 미치고 잊어버릴 수 있으며 루트 권한이 필요합니다.
특정 파일이나 프로그램을 교체 불가능으로 표시할 수 있습니까? 루트 액세스 없이도 가능합니까? 기술적으로 능숙한 사용자에게 배포할 수 있고 메모리 내용이 디스크로 절대 교환되지 않는 애플리케이션을 작성하는 것이 가능합니까?
답변1
의견에서 나는 cgroup을 생성하고 memory.swappiness
(스와핑을 최소화하기 위해) 0으로 설정한 다음 그 안에서 애플리케이션을 실행하라고 제안했습니다. 이렇게 하면 신청서가아마도물리적 메모리가 너무 부족하여 해당 cgroup의 프로그램에 대한 페이지를 스와핑하는 것이 사용 가능한 충분한 물리적 메모리를 확보하는 유일한 방법이 아니면 스와핑이 발생하지 않습니다.
RHEL 6.5에서 이 작업을 수행하려면:
패키지가 설치되어 있는지 확인하십시오
libcgroup
. 이를 통해cgcreate
및 와 같은 사용자 공간 도구에 액세스할 수 있습니다cgexec
.cgconfig
재부팅 후에도 cgroup 구성 변경 사항이 유지되도록 서비스를 시작하고 활성화합니다 . RHEL에서 이 서비스는/cgroup
트리 아래에 필요한 파일 시스템도 마운트해야 합니다.다음 명령을 사용하여 cgroup을 생성합니다.
cgcreate -g memory:thunderbird
이 그룹의 교환성을 0으로 설정합니다.
cgset -r memory.swappiness=0 thunderbird
cgsnapshot -s > /etc/cgconfig.conf
서비스의 업데이트된 영구 구성을 저장하는 데 사용됩니다cgconfig
(지금까지의 모든 변경 사항은 런타임 변경이었습니다. 기본 구성 파일을 어딘가에 저장하고 영구 구성으로 만들기 전에 한 번 확인할 수 있습니다.cgexec
이제 다음을 사용하여 cgroup 에서 원하는 애플리케이션을 시작할 수 있습니다thunderbird
.[root@xxx601 ~]# cgexec -g 메모리: Thunderbird ls
anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp sleep sleep.c SSL 빌드 스택 테스트
[루트@xxx601 ~]#
실제로 설치하지 않았 thunderbird
거나 설치했을 것입니다. 위 형식이 왜 혼란스러운지 잘 모르겠습니다.
대안
cgexec
은 Thunderbird를 시작하고 PID를tasks
응용 프로그램 파일에 추가하는 것입니다. 예를 들어:[root@xxx601 ~]# 고양이 /cgroup/memory/thunderbird/tasks
[root@xxx601 ~]# pidof httpd
25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109
[root@xxx601 ~]# echo 25926 > /cgroup/memory/thunderbird/tasks
[root@xxx601 ~]# 고양이 /cgroup/memory/thunderbird/tasks
25926
다시 말하지만, 이것이 기술적으로 스왑을 방지하는 것은 아니지만 응용 프로그램 자체를 수정하지 않는 것이 아마도 최선의 선택일 것입니다. 나는 memory.memsw.limit_in_bytes
이것이 강제 존재를 더 직접적으로 통제할 수 있는 것처럼 보인다는 것을 방금 발견했습니다.아니요교환했지만 문제가 완전히 해결되었다고 말할 수 있을 만큼 충분히 시도하지 않았습니다. 즉, 이것은 나중에 살펴볼 사항일 수 있습니다.
실제 대답은 mlock
이러한 문제를 해결하기 위해 애플리케이션에 민감한 정보를 제공하는 것입니다. 그래도 Thunderbird와 같은 앱이 이 작업을 수행할 의향이 있지만 이에 대해 논평할 만큼 내부에 대해서는 잘 모릅니다.
답변2
응용 프로그램은 메모리를 교체할 수 없도록 메모리를 잠글 수 있습니다.
mlock, munlock, mlockall, munlockall - lock and unlock memory
하지만 나는 이것에 외부적으로 영향을 미칠 수 있는 어떤 방법도 모릅니다. 직접 사용하려면 신청서를 작성해야 합니다. 첨부 파일 등을 보기 위한 외부 프로그램도 포함되는 경우가 많기 때문에 메일의 경우 특히 어려울 수 있습니다.
또한 memlock을 사용하더라도 스왑 파티션에 포함될 가능성이 있습니다. 디스크 일시 중지를 사용하면 스왑이 아닌 기본 설정에 관계없이 모든 메모리가 디스크에 기록됩니다.
전체 디스크 암호화를 먼저 수행하는 것이 더 쉽습니다.
답변3
예, 애플리케이션은 다음과 같은 이유로 메모리 일부가 교체되는 것을 방지할 수 있습니다.mlock
시스템 호출. 그러나 이는 귀하의 경우에는 별로 유용하지 않습니다.
기밀 데이터는 애플리케이션 메모리에만 존재하는 것이 아닙니다. 이는 다른 위치 /tmp
( 등) 의 임시 파일로 끝납니다 /var/spool
. Thunderbird 자체가 해독된 이메일을 표시하므로 RAM에도 잠가야 합니다.
디스크에 기밀 파일의 흔적이 포함되어 있지 않은지 확인하려면 스왑 영역과 임시 파일의 모든 잠재적 위치를 암호화해야 합니다(특히 /tmp
tmpfs가 아닌 경우 대부분은 /var
물론 집에서도). 디렉토리).
암호화폐 거래소는 성능에 거의 또는 전혀 영향을 미치지 않습니다. 암호화는 디스크 I/O보다 훨씬 빠릅니다.
답변4
nice
시작 스크립트를 사용하여 높은 우선 순위로 시작 하고 renice
I/O 우선 순위 변경을 사용하는 등 응용 프로그램 프로세스의 우선 순위를 변경하여 시작하는 것이 더 나을지 궁금합니다 ionice
.
예를 들어, 응용 프로그램을 가장 높은 우선 순위로 "최적화"하여 -20
응용 프로그램 프로세스를 교체할 시기를 결정함으로써 운영 체제가 최선의 작업을 수행하도록 할 수 있습니다.
그러나 다른 사람들은 더 많은 제어와 세부성을 원한다면 보기 cgroups
및 설정을 시작해야 한다고 제안합니다.memory.swappiness