본문 바로가기

Job Notes/File System

SFS (Secure File System)

Secure File System

 

 

. 서론

 

3 세대 모바일 환경이 도래하면서 무선 단말기를 이용하여 인터넷, 통신 등의 외부와의 접속이 증가될 것이다. 거기다가 무선 단말기들이 WIPI, BREW 등과 같은 동일한 플랫폼을 가지면서 사용자의 데이터들에 대한 보안을 고려해야 할 것이다. 이에 타 회사의 파일 시스템 보안에 대해 검토해보고 EoFS에 어떻게 적용시킬지 고려해본다.

 

 

. Secure File System

 

1.       개요


   무선 단말기의 중요 데이터들의 Integrity와 Confidentiality를 보장하기 위해 파일 시스템에 Secure File System(SFS)을 추가하였다. 해당 데이터로는 Browsing and Messaging, Ringtone and Music Player, Video Player, Positioniung에 사용되는 데이터들의 DRM, GPS와 E-Commerce Data, Device Keys and Certificates가 있다.

공개된 SFS에 대해 검토해본다.

 

 

2.       SFS

 

SFS란 파일시스템에 저장된 파일들을 보호하기 위해 만들어진 알고리즘이다. 현재 SFS는 네트워크의 서버-클라이언트 또는 클라이언트-클라이언트 상에서 사용자만 파일에 암호화 방법을 적용하여 다른 사람이 접근하지 못하게 하기 위해 사용되고 있다. 그 방법으로는 대상에 따라 Volume Encryptors, File Encryptors, File System Encryptors 세 가지로 나뉠 수 있다. 여기서는 파일을 암호화하기 위함을 목적으로 하기 때문에 File Encryptors에 대해서만 검토한다.

SFS는 일반 파일 시스템(FAT, JFFS2, ext2 등)에 접근할 때 사용되는 것으로, 파일의 데이터들을 암호화하여 Flash Memory나 SD Card에 저장하고 이를 읽을 때 복호화한다. 여기서 사용되는 암호화/복호화 알고리즘은 정해진 것이 아니며, 필요에 따라 알고리즘을 결정할 수 있다. 만약 EoFS에 SFS를 적용시킬려고 하면 이 암호화 알고리즘을 선택할 때 보안성도 중요하지만 실행 속도도 많이 고려되어야 할 것이다.

 

 

우선 암호화 알고리즘 중 RSA를 적용했을 때의 구조를 살펴보기로 한다.

  그림 1은 일반 파일 시스템의 동작을 나타낸 것으로 모든 상황에서 파일의 원문을 전송한다.

사용자 삽입 이미지

Standard working of a computer without SFS


< 그림 1. Standard working of a computer without SFS >

 

그림 2는 일반 파일 시스템에 SFS를 추가한 것이다. 그림에서 sfsd와 libsfs가 SFS에 해당하는 부분이다. sfsd는 SFS의 핵심 부분으로 SFS Daemon이라고 한다. 그 기능은 데이터들의 암호화, 복호화, 사용자와 파일들을 관리한다. libsfs는 일반 파일 시스템에 SFS가 추가된 library를 제공하는 것으로 SFS Library라고 한다. 그림을 보면 전송하는 데이터의 종류를 알 수 있다.

사용자 삽입 이미지

sfsd and libsfs in action


< 그림 2. sfsd and libsfs in action >

 

 

3.       SFS 처리

 

아래 그림은 파일 연산 시 어떻게 암호화/복호화 하는 지 보여준다.

먼저 login 시 SFS 디렉토리에 저장된 encrypted private key를 password와 함께 복호화한다. 이 decryped private key와 uid를 sfsd에 저장하여 log off 때까지 기억한다.

open하면 encrypted file key를 받아오고 이를 login 시 저장한 private key를 이용해 decryped file key를 받아와서 저장한다. 이는 close할 때까지 기억하며, close 시 이를 지운다.

write/read는 open 시 저장한 file key를 이용해 데이터를 읽거나 쓴다.

-----------------------------------------------------------------

CALL                               DAEMON                                                    CALLS

-----------------------------------------------------------------

login      ->        (uid,key)

 

                           users[uid] = key

O.K.       <-

-----------------------------------------------------------------

open      ->          (path,fd,pid,uid)

                                                                  ->          get_file_key(path,uid)

                                        ekey                   <-

                                                                  ->          decrypt_key(ekey,user_key[uid])

                                        dkey                   <-

 

                           files[pid,df] = dkey

O.K.       <-

-----------------------------------------------------------------

close     ->          (fd,pid)

 

                           delete files[pid,fd]

O.K.       <-

-----------------------------------------------------------------

read      ->          (fd,pid,buf,count)

 

                           dkey = files[pid,fd]

                                                                  ->          decrypt(buf,count,dkey)

                                        buf                      <-

buf         <-

-----------------------------------------------------------------

write      ->          (fd,pid,buf,count)

 

                           dkey = files[pid,fd]

                                                                  ->          encrypt(buf,count,dkey)

                                        buf                      <-

buf         <-