2016년 9월 7일 수요일

SEAndroid

본 문서는 OLPP(Object Linked Programming Paradigm)으로 작성되었습니다. 

SEAndroid의 목적 : 보안 향상. 쓸대없긴 하지만 어떤 메카니즘인지는 알면 좋음.
SEAndroid : 상태, 이미 Android phone에 들어가 있다. - 그래서 알아야 함. 
                       행동, 삼성폰에서 활동하고 있고, 그리 많지는 않은 엔지니어들이 개발하고 있다.

SEAndroid와 연관된 객체들 
- NSA의 스테판 스몰리(미국에서 리눅스와 안드로이드를 많이 쓰니 국가적 보안에 신경 쓴다고 생각한다)
- TRESYS의 빌 로버츠 : 해커다. 스테판 스몰리랑 친하고 SEAndorid 코어 부분을 거의 혼자 만들고 머지했다고 해도 과언이 아니다. 트레시스는 RHEL 리눅스 정책을 만드는 회사로 SELinux와 관련 있다. 구글에 가고 싶어 했는데 Google Security 팀에서 너무 잘해서 안 뽑았나 보다.(거기도 정치 많겠지) 해커고, 지금도 AOSP에 기여하고 있다. 뒤에 또 이야기한다.
- 삼성 : 안드로이드 점유율 오랜 기간 1위(지금도 1위인가?) SE for Android라는 이름으로 변경하여 KNOX에 탑재시켰다. 참고로 SEandorid는 구글이 만든 거 아니다. SELinux를 NSA에서 만들었고 그걸 포팅한 것이 SEAndroid다. 지금은 구글이 신경 많이 쓰고 있겠지. iOS 보안을 대체할 유일한 대항 마니까. 정책을 만드는 데는 유저 테스팅이 필요한데 수십억 써서 정책 만들고 죽 쒀서 개 주듯이 구글에 주었다. 안드로이드 투자받으러 왔을 때 차 버려서 구글에서 인수한 것이 이런 태풍을 몰고 올 줄은 상상도 못 하였을 것이다.

역사


SEAndroid의 공식 위키는

에서


으로 옮겨졌다. google이 상표권을 주장하는 바람에 NSA에서도 SEAndroid를 못쓰고, 삼성에서도 SE for Android라는 거추장스러운 이름으로 쓴다.

AOSP에 SEAndroid 코드의 대부분을 머지한 사람은 Bill Roberts다. NSA의 Stephen Smalley 가 가장 큰 도움을 주었고, Core 보다 더 중요한 정책은 삼성이 만들었다.

삼성 자체 스토어 하면 안드로이드 못 만들게 한다던 안드로이드는 그전에, 관련 정책을 Open 하지 않으면 Android 승인을 주지 않겠다던 구글 때문에 결국 정책을 빼앗긴다. AOSP 코드야 구글에서 브랜치 관리를 하는 것이니 머지하면 모두 구글 것이 된다.
 특허 빼먹고 버렸던 모토로라의 PLAY를 직접 경험해 보니 확실히 구글은 대단한 회사다.

What is SEAndroid?


SEAndroid는 파일 시스템에 상태 값이 하나 더 추가된 것이 전부이다. 그 상태 값은 부팅 시 정책에 의해서 관리가 되며 root가 접근하지 못한다. root 자체도 부팅 후에 권한이 생성되는 것이다. root 접근하고자 하는 context가 파일이던 메모리던 시스템 장치던 해당 권한이 없다면 변경시킬 수가 없다. 그래서 root 권한을 획득해도 안전하다. 당연히 깰 수 있는 방법은 있다. 리눅스 이미지 자체를 조작하면 된다.

What is TIMA?

TrustZone-basedIntegrity Measurement Architecture

커널 조작을 막는 기술이다. 우리가 인터넷에서 받은 파일이 조작되었는지 아닌지 보려면 해시 키 값을 조사하면 된다. 그와 비슷한 기술이다.

SEAndroid 내부 구현은 복잡하나 단순히 하나의 접근 필드를 만드는 것일 뿐 이 듯. TIMA 역시 변조된 커널을 찾는 기술이다. 그러나 부트로더를 조작하면 또 크래킹이 가능하다.

What is Trusted Boot?


부트로더가 변경되었는지 아닌지 체크한다. 구현은 복잡하다. 목적은 하나다. 부트로더 변경 막아서 커널 보호하는 것. Secure boot라고도 한다. 뭐라고 하든 말든... 

여기서 H/W 엔지어 니는 궁금증이 생긴다. 엔지니어링 모드가 막히는 것이라도 TRACE32로 플래싱 할 때 잘 조작해서 하면 안 될까? 어차피 내 맘대로 바꿀 수 있는 것이잖아.

그래서 들어간 기능이

H/W Root of Trust


오래전 인텔이 MMX 명령어를 칩에 새겨 넣듯, 보안 코드를 아예 칩에 새겨 버린다. 

그래도 크래킹 해보자고 할 수 도 있다.

BGA 타입으로 실장 된 칩을 뽑아서 일일이 펌웨어를 뽑아서 펌웨어 읽어서 복사하고 새로운 칩에 조작해서 넣은 다음 다시 실장.

허튼짓이다.

왠지 스캔들 있을 것 같은 오바마 폰 가져와서 엄청난 비용을 들여도 큰 사건을 터뜨릴 수 있다면.

문제는 오바마 폰을 뺏는 게 더 힘들고, 더군다나 스캔들은 없을 것 같다. 뭐 양민 학살하라고 명령 내릴 것 같지도 않고, 설사 그렇다고 해도 내부자가 이미 위키릭스를 통해 폭로하겠지.

즉, 더 이상 생각하는 것은 비용 낭비다.

What is KNOX?


이것을 다 합한 것이 KNOX다. 게다가 컨테이너를 추가하여 VMWARE나 좀 더 유연한 DOCKER 의 역할을 수행한다. 간단히 말하면 물리적 폰 2개를 폰 하나에 집어넣었다고 보면 된다. MDM과 결합하여 회사에 들어가면 폰을 회사 환경으로 바꾸고 외부로 자료 유출이 되지 않게 할 수 있다.

그래서 미 펜타곤에서도 보안 인증을 해 줬다. 되게 까다로운 절차를 통과했다.

Fin.


SEAndroid의 경우 정책을 강력하게 하면 못 막을 게 없다. root도 막는데... 속도를 항상 고려했기 때문에 속도도 그리 느리지 않다. 그러나 강한 정책은 사용자 편의성을 떨어뜨린다.

이 정도면 매우 간단하게 숲을 보았다. 다음 회부터는 매우 지루한 이야기를 할 것이며, 이번 주에 마무리지으려고 한다. 마무리 안되어도 그만두려고 한다. 어차피 이 정도 Security를 돌릴만한 회사는 그리 많지 않으며(LG 친구들이 좋아하겠네) 돌릴 회사들은 돌리고 있고(삼성에서는 더 많이 업그레이드되었겠지), 다른 보안 담당자들은 이 정도만 이야기해도 스스로 소스 찾아서 보면 다 이해될 내용이기 때문이다.

3년간의 시간이 이렇게 짧은 글로 표현되다니, 나도 깜짝 놀란다. 부디 관련해서 궁금했던 분들에게 많은 도움이 되었으면 한다. 행여나 구글 깐 것 같은 느낌이 들었다면 사실만 적었으니 오해 말고, 사실 구글이 대단한 것은 그 안의 구성원이 아니다. 구글 출신들은 창업을 많이 한다는 것이다. 일자리를 창출하고 사람들이 굶지 않게 해주는 그룹이다. 비슷한 단어로 서울대, 대기업 출신, 사회 부적응자처럼 보이는 geek 하고 실력 있는 엔지니어들이 있다.

2016년 8월 19일 금요일

Mobile web page 지원 안 하기

jQuery를 사용하는데 모바일 페이지를 제공하고 싶지 않았다. 워드프레스 써도 모바일 때문에 텍스트 배치를 계속 신경 써야 했기에 모바일용 웹은 신경 쓰지 않기로 했었었다. 잉여로운 시간이 많으면 신경 쓰기로...

<html>
<head>
<meta charset="utf-8">
</head>
<body>
모바일 버전은 지원하지 않습니다.
</body>
</html>

이렇게 페이지를 만든다. nmobile.html이다. 본래는 !mobile.html로 하고 싶었다.

<html>
<head>
<meta charset="utf-8">
<script type="text/javascript">
var isMobile = false; 
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
    || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;
if(isMobile) {
alert('모바일 버전은 지원하지 않습니다.');
document.location = "http://hajunho.com/owner/nmobile.html";
}
</script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js">
</script>
</head>

stackOverflow에 필터링 관련 좋은 예제가 있어서 head 부분에 적용했다.

자주 쓸 것 같아서 남겨 둔다.

IT 강의 세미나 멘토링(과외)

IT 는 Information Technology 의 약자이다. ICT(Information and Communications Technology) 를 포함한다.

정보 기술을 가르쳐 주지만 강의, 세미나, 과외에도 비용이 발생한다.

가장 선호하는 것은 멘토링이다. 과외라고 할 수 도 있다. 차이점은 비용의 차이 정도랄까? 멘토링은 재능 기부와 유의어로 멘티가 비용 지불을 안하는 것이 통념이다. 과외에서는 모든 것을 말해 줄 수 있다. 어떤 조직이던 사회적으로 절대적 기준보다 남보다 조금 더 잘하는 것이 기준인 경우가 많다. 대기업에서 상층부를 구성하는 있는 사람들 중에 노벨상, 필즈상 수상자가 없는 것과 크게 다르지 않다. 남들보다 낫기 위해서 정보의 폐쇄가 일어난다. 작은 정보가 방향을 결정하기에 결론적으로 멀리 가서 보면 커다란 차이가 난다.
 모든 것을 이야기 할 수 있는 과외. 안다는 것을 상대방에게 전달하기가 쉬운 일이 아니다. 과외의 경우 상대방의 입장을 케바케(Case by Case)로 고려할 수 있기에 가장 효과적이다.

나의 경우 세미나는 영화에 비유하고 강의의 경우 드라마에 비유한다.

세미나는 짧은 시간안에 하나의 완결된 메시지를 담고 있어야 한다.
강의의 경우 다음 강의가 궁금해지도록 끊는 것이 포인트다.

둘 다 별로 선호하지 않지만 돈을 벌기 위해 하는 경우가 많다. 왜냐면 강의, 세미나는 온라인을 통해서 많이 퍼져 나가기 때문에 수년간 경험으로 터득한 비법을 단 몇십분안에 풀어가는데 와전되는 경우가 많다. 수많은 이론가들에게 이론적으로 혹평을 당하기도 한다.

예를 들어 나름대로 높은 산에 올랐다가 무사히 하산해서 마음 속에 큰 산을 담고, 중간중간 알아야할 경험들을 많이 배워서 가르쳐 주려고 하는데, 에베레스트에 비교하고 엄홍길 같은 등반가와 비교를 한다거나 하는 식이다. 꼭 큐브 대회에서 1등한 사람이 큐브를 가르쳐 줄 수 있는 것은 아니다. 구글 코드잼에서 10등 안에 든  사람만 알고리즘을 가르쳐 줄 수 있다고 하면 우리나라에 알고리즘을 가르쳐 줄 수 있는 사람은 아무도 없다.

청중도 문제이다. 자신이 부족하기에 세미나나 강의를 들으면서 자신은 잊고 평가자가 되기도 한다. 청중의 5% 가 꼭 그렇다. 5% 이긴 하지만 큰 스트레스 이기에 오로지 돈 때문에 강의나 세미나를 한다. 20대 때에는 그렇지 않았다. 5%의 싫은 청중이 있다고 해도 배움에 목마른 파릇파릇 눈망울들을 보면 박봉이지만 열정을 불태울 때도 있었다.

지금은 그렇지 않고, 내가 틀렸다. 그래서 젊은 시니어들이 많이 나와서 우리나라를 이끌 어린 친구들에게 많은 것을 가르쳐 줬으면 한다.

세미나는 완결된 주제를 담고 있어야 하고,
강의는 다음편이 기대될만큼 재미있어야 한다. 끊기를 잘해서 궁금하게 하는 것도 방법이다.
과외(private lesson), 멘토링은 소수의 사람에게 하는 만큼 알짜 정보를 많이 줘야 한다.

정리하면 이렇다.

무제한 개인 클라우드는 없습니다.

클라우드라고 하면 회사를 생각하게 됩니다.
구글, 아마존, 드랍박스, 마이크로소프트가 그 예 입니다.

business version, unlimit 이라고 불리는 것들을 써 봤지만 다 거짓 입니다. 무제한 용량은 아니고 일정 용량 늘어나면 확장해 주는 방식으로 내부는 구현되어 있습니다. 정말 무제한 이라면 왜 DB를 샤딩하고 샤딩이 안되는 NoSQL은 여러개의 노드를 두는 것일까요?

얼리어답터로 각 서비스들의 언리밋 또는 비지니스 버전을 써 본 결과 대용량 자료는 외장 하드 디스크를 다분할 하던지. 아는 사람에게 보관해 달라고 이중 백업을 하는 것이 더 낫다는 결론에 이르렀습니다. 데이터 센터가 번개 맞아서 데이터 유실이 있었던 구글처럼. 다른 지역에로의 전파가 없는 이상 무조건 믿는 것은 잘못되었다고 판단된 것이 첫번째 이유 입니다. 그리고 언리밋 비용은 싸지 않습니다. 하드 디스크 수명이 3~5년 정도 된다고 생각해보면요. 그리고 언리밋이라고 하는데 3TB 가 넘어가면 싱크 속도가 너무 느립니다. 500Gb sync 하는데 일주일이 걸립니다. 이것도 네트워크 비용이 비싸기 때문에 어쩔 수 없는 부분입니다.

클라우드는 협업, 혹은 서비스용으로 써야 합니다. 유럽 쪽 로그만 받는 아마존 서비스 이용시 월 250만원 정도 냈었습니다. 그래야 클라우드도 장사가 되겠지요. 월 5천원 내는 서비스로는 감당이 안 될 것 입니다. 그러니 무제한으로 광고해서 고객을 잡은 다음.

속도를 늦추거나,
마음대로 지울 수 있다는 약관으로 데이터를 지워 버리거나

합니다. 개인 클라우드 시장은 글로벌 최강자가 나올 수 없는 구조 입니다. 이에, 로컬 사업자 분들이 많이 참여하셨으면 합니다.

드랍박스가 싱크률, 성능이 뛰어나나 1TB가 한계이고 또 그만큼 비쌉니다. 그 돈으로 매년 외장 하드 디스크를 사서 백업하는 것이 나아 보입니다. 원격 Sync의 경우 bittorrent 만큼 빠르지도 않거든요.

아마존의 경우 1TB가 넘어가면 급격히 느려지기 시작합니다. 그리고 저작권 자료를 마음대로 지울 수 있다는 약관을 보면, 사용자에게 자료를 빼가는 역할을 하려는 인식을 줍니다. 세상의 모든 자료를 보관할테니 우리가 존재할 이유가 있다. 는 식의.

이럴거면 구글을 쓰는 것이 낫습니다. 물론, 3TB 부터 엄청난 에러를 만나게 되지만 1~2TB에서 개인 자료는 잘 정리를 하게되면 동영상의 경우 youtube 기술로 플레이 해 주고, google의 파워풀한 검색 서비스를 이용하도록 해줍니다. 문서나 파워포인트, 엑셀도 바로 편집이 가능하며 다중 작업에 유리합니다. 구글 행아웃까지 고려한다면 결국 남길 수 밖에 없는 서비스 입니다.

마이크로소프트는 애플과 같이 사생활 보호에 가장 적극적이기에 개인적으로 좋아하지만 드랍박스와 비슷한 입장입니다. 비지니스로는 이용하나 개인 드라이브로는 적합치 못하다는 생각입니다. 애플의 iCloud도 결국 가격 때문에 포기 했었는데 onedirve도 같은 이유 입니다.

가격이 무조건 비싸다는 뜻은 아닙니다. 외장 하드 디스크보다 비싸다는 뜻이지요. 사진 유실이 두려워서 무제한 데이터에 수시로 백업을 했었지만, 시간 날 때 bitsync나 iTunes를 이용해서 한번에 백업, 안드로이드의 경우도 마찬 가지 방식이 더 낫다고 판단됩니다. 사진이 쌓여 1TB가 넘어가면 사실 정리할 시간도 없는데 한꺼번에 백업 하는 것이 더 낫다는 의견 입니다.

개인적으로는 소프트웨어 산업에 쓰는 돈은 아깝지 않아서 모든 클라우드를 이용하고 있습니다. 애플도 최근 까지 유료 버전을 썼었구요. 그러나 개인 클라우드 무제한의 거짓과 그렇게 밖에 할 수 없는 마케팅을 이해하고 , 네트워크 트레픽 제한으로 불편을 겪고 나서는 구글을 제외하고 모두 정리하기로 했습니다. 덕분에 9월에 결재해야할 년간 요금으로 3TB 외장 하드디스크를 매년 구입할 수 있게 되었습니다. 구입 할 수 있는 하드 디스크 용량은 조금씩 늘어나겠지요.

데스크탑에서 쓰는 10TB 용량의 비지니스 자료들은 클라우드로도 백업 못합니다. 유실되면 유실되는대로 놔둘 수 있는게 기술 트렌드도 계속해서 바뀌기 때문입니다. 큰 쇼핑몰 자료들 소스도 새로운 기술로 바꾸는 것이 더 비용이 많이 들기 때문에 지나간 자료들도 필요 없게 되어 버립니다. 디자인 자료도 트렌드를 지나 버려서 필요 없게 되어 버립니다.

설사 필요하다고 해도 그것들을 다 볼 물리적 시간이 점점 없어집니다. ^^

구글 클라우드 파일 100만개 넘어가니 3일동안 실패하는군요.
에러 메시지 창도 6개월 전과 다름이 없습니다. Sync 기술 어렵지요. 그러나 시작 전 환경 설정에 selective folder만 sync토록 했는데 굳이 전체 drive 파일을 검색할 필요는 없을텐데 말이죠. Amazon이 해당 부분을 해결 했지만, 제가 볼 때는 일부러 다운되게 해서 편하게 못 쓰게 하려는 속셈인 것 같습니다. 웹으로 하나씩 올리게 하려구요.

아이디어를 하나 내자면,
은행에서는 부업으로 어느 정도의 공간을 할애하여 외장 하드 디스크 보관소를 만들면 좋을 것 같습니다.

저 역시 SW 회사 인력이지만, 플랫폼 하나 만들어 두고 편하게 돈 버는 회사 보다는 물리적으로 제품을 생산해 내는 회사를 더 선호하기 때문입니다.

일한자가 돈을 벌어야 합니다. 물리적 제품 생산은 노력을 측정하기가 눈에 보이지 않는 것을 만드는 것보다 수월합니다.

2015년 9월 7일 월요일

배열

□ 배열 : 같은 Data type을 가진 여러 개의 데이터를 관리하고자 할 때 사용
※ 기본 데이터형으로 선언된 배열이라도 배열 자체가 객체이기 때문에 생성된 배열 객체는 항상 Heap영역에 저장
○ 배열 객체 생성 방법
① 3단계
ex) int array[]; array = new int[3]; array[0] = 1; array[1] = 2; array[2] = 3;
② 2단계
ex) int array[] = new int[3]; array[0] = 1; array[1] = 2; array[2] = 3;
③ 1단계
ex) int array[] = {1,2,3);

※ int array[] = new int[]{1,2,3};

※ 선언부에는 배열의 크기가 선언될 수 없음

□ 배열의 각 요소의 데이터 값은 변경 가능, 배열의 크기는 절대로 변경 불가능, 동적으로 배열 크기 변화시키고 싶으면 java.util 패키지의 Collection 사용(Section 9참조)

□ 생성된 배열은 인덱스를 가지고 있고 배열의 첫 요소의 인덱스는 0이다.

□ 생성된 배열에 요소의 값을 정의 하지 않으면 컴파일러에 의해서 기본 값으로 초기화

데이터 형
기본 초기 값
boolean
false
byte
0
short
0
char
‘\u0000'
int
0
long
0
float
0.0f
double
0.0d
reference type {ex)String 클래스}
null
 

대학원생의 투고 지도 ④ (완결) — 논문의 수준이란 무엇인가: 사다리와 사분위, 첫 논문 전략

완결편이다. "논문 수준"이라는 말을 해부하고, 에듀테크 석사생의 첫 논문 전략으로 마친다. 학위논문과 학술지 논문은 다른 장르다 먼저 가장 흔한 혼동부터. 학위논문(thesis)은 "내가 연구를 수행할 줄 안다...