Ранният растеж на Java беше стимулиран от код за изтегляне в мрежа, по-известен като аплети. Защитата на аплетите се разви с нарастването на Java и днес е източник на често объркване поради разнообразието от версии на Java, предлаганите в търговската мрежа браузъри и приставки.
Тази статия, третата от поредицата, ще обхване различните изисквания за сигурно изпълнение на Java код, изтеглен от мрежа. Въпреки че мобилният код не е революционна концепция, Java и Интернет представляват някои уникални предизвикателства пред компютърната сигурност. Еволюцията на архитектурата на Java и нейното въздействие върху основната защита на Java беше обсъдена в части 1 и 2. Тази статия има различен подход: практически подход за свързване на всички концепции заедно чрез разполагане на прост аплет, който пише в локалната файлова система .
Развитие и концепции за сигурност на Java: Прочетете цялата поредица!
- Част 1: Научете концепции и термини за компютърна сигурност в този уводен преглед
- Част 2: Открийте тънкостите на Java сигурността
- Част 3: Справете се със сигурността на аплета Java
- Част 4: Научете как незадължителните пакети разширяват и подобряват защитата на Java
- Част 5: J2SE 1.4 предлага множество подобрения в защитата на Java
В примерното ядро на аплета е криптографията с публичен ключ, въведена по-рано в тази поредица. Код, подписан с помощта на частния ключ на подписалия, може да се изпълнява на клиентски машини, след като публичният ключ, съответстващ на подписалия се счита за доверен на съответната машина. Ще обсъдим също как файловете с правила, които предоставят разрешения и хранилището на ключове, могат да се използват като хранилище за публични и частни ключове. Освен това ще подчертаем инструментите за защита на Java 2 SDK и Netscape signtool
, тъй като те позволяват внедряването.
Тази статия проследява еволюцията на защитата на Java, започвайки със защитата на приложенията в първоначалната версия на Java 2 и преминавайки към последната версия на Java 2, версия 1.3. Този подход помага да се въведат понятията постепенно, като се започне с много прости понятия и завърши с доста напреднал пример.
Тази серия няма за цел да предостави изчерпателно ръководство за компютърна сигурност. Компютърната сигурност е многостранен въпрос, засягащ няколко дисциплини, отдели и култури. Инвестициите в технологии трябва да бъдат последвани от инвестиции в обучение на персонала, стриктно прилагане на политиките и периодичен преглед на цялостната политика за сигурност.
Забележка: Тази статия включва работещ аплет Java, предназначен да демонстрира проблеми със сигурността на аплета. Прочетете по-долу за повече подробности.
Сигурност на приложенията
Нека започнем нашето разследване, като разгледаме сигурността на приложенията. В част 2 видяхме как защитата на Java се е развила от модел на пясъчник до фино модел на защита. Също така видяхме, че приложенията (локален код) по подразбиране получават безплатно управление и не подлежат на същия контрол като аплетите (код за изтегляне от мрежата), които обикновено се считат за ненадеждни. Като промяна от миналото, в Java 2 приложенията за защита могат по избор да бъдат обект на същото ниво на контрол като аплетите.
Първо, кратка бележка за writeFile.java
кода, използван в тази статия за илюстриране на защитните функции в Java 2. Тази програма е леко модифицирана версия на кода на аплета, предоставена от Sun, достъпна в мрежата, за да илюстрира някои от характеристиките на Java 2 сигурност. Програмата, модифицирана за осигуряване на поддръжка на приложения, се опитва да създаде и напише файл в локалната файлова система. Достъпът до локална файлова система се проверява от мениджъра на сигурността. Ще видим в тази статия как тази конкретна операция може да бъде разрешена по сигурен начин.
/ ** * По подразбиране това поражда изключение за защита като аплет. * * С JDK 1.2 appletviewer, * ако конфигурирате вашата система да предоставя аплети, подписани от "Duke" * и изтеглени от уебсайта на Java Software, за да напишете файл * във вашата / tmp директория (или във файла с име "C: \ tmpfoo "на * система Windows), тогава този аплет може да работи. * * @version JDK 1.2 * @author Marianne Mueller * @Modified by Raghavan Srinivas [Rags] * / import java.awt. *; импортиране на java.io. *; импортиране на java.lang. *; импортиране на java.applet. *; публичен клас writeFile разширява аплета {String myFile = "/ tmp / foo"; Файл f = нов файл (myFile); DataOutputStream dos; public void init () {String osname = System.getProperty ("os.name"); ако (osname.indexOf ("Windows")! = -1) {myFile = "C:" + File.separator + "tmpfoo";}} публична невалидна боя (Графика g) {try {dos = new DataOutputStream (new BufferedOutputStream (new FileOutputStream (myFile), 128)); dos.writeBytes ("Котките могат да ви хипнотизират, когато най-малко очаквате \ n"); dos.flush (); dos.close (); g.drawString ("Успешно записах във файла с име" + myFile + "- отидете да го разгледате!", 10, 10); } catch (SecurityException e) {g.drawString ("writeFile: уловено изключение за сигурност", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: catch i / o изключение", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Център", запис на файл); f.setSize (300, 100); f.show (); }}}}}}Котките могат да ви хипнотизират, когато най-малко очаквате \ n "); dos.flush (); dos.close (); g.drawString (" Успешно записах във файла с име "+ myFile +" - погледнете го ! ", 10, 10);} catch (SecurityException e) {g.drawString (" writeFile: уловено изключение за сигурност ", 10, 10);} catch (IOException ioe) {g.drawString (" writeFile: catch i / o изключение ", 10, 10);}} публична статична празнота main (String args []) {Frame f = new Frame (" writeFile "); writeFile writefile = new writeFile (); writefile.init (); writefile.start ( ); f.add ("Център", запис на файл); f.setSize (300, 100); f.show ();}}Котките могат да ви хипнотизират, когато най-малко очаквате \ n "); dos.flush (); dos.close (); g.drawString (" Успешно записах във файла с име "+ myFile +" - погледнете го ! ", 10, 10);} catch (SecurityException e) {g.drawString (" writeFile: уловено изключение за сигурност ", 10, 10);} catch (IOException ioe) {g.drawString (" writeFile: catch i / o изключение ", 10, 10);}} публична статична празнота main (String args []) {Frame f = new Frame (" writeFile "); writeFile writefile = new writeFile (); writefile.init (); writefile.start ( ); f.add ("Център", запис на файл); f.setSize (300, 100); f.show ();}}} catch (SecurityException e) {g.drawString ("writeFile: уловено изключение за сигурност", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: catch i / o изключение", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Център", запис на файл); f.setSize (300, 100); f.show (); }}} catch (SecurityException e) {g.drawString ("writeFile: уловено изключение за сигурност", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: catch i / o изключение", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Център", запис на файл); f.setSize (300, 100); f.show (); }}
Изпълнявайки байт кода, генериран в Java 2 Runtime Environment, Standard Edition (JRE) ще позволи на приложението да модифицира файла в локалната файлова система по подразбиране, тъй като политиката по подразбиране не подлага приложения Java 2 на мениджър на сигурността. Тази политика е оправдана, тъй като приложенията обикновено са локално генериран код и не се изтеглят по мрежата. Следващият команден ред създава прозореца, показан на фигура 1, показващ, че файлът е създаден и записан в.
$ java writeFile
За да подложите кода на мениджъра за защита на Java 2, извикайте следния команден ред, който трябва да доведе до резултатите, посочени на фигура 2. Забележете, че приложението генерира изключение за защита, причинено от опит за модифициране на локалната файлова система. Изрично включеният мениджър на защитата генерира изключението.
$ java -Djava.security.manager writeFile
Илюстрираните по-горе случаи представляват екстремни примери за политика на сигурност. В първия случай приложението не е било обект на контрол; в последния беше подложен на много строг контрол. В повечето случаи ще е необходимо да зададете политиката някъде между тях.
Можете да постигнете междуполитика, като използвате файл с политика. За целта създайте файл с правила, извикан all.policy
в работната директория:
grant {разрешение java.io.FilePermission "<>", "write"; };
Изпълнението на една и съща част от кода със следния команден ред ще позволи модификация на локалната файлова система:
$ java -Djava.security.manager -Djava.security.policy = all.policy writeFile
В този пример приложението беше предмет на диспечера на защитата, но цялостната политика се управляваше от файла с политиката, който позволяваше да бъдат модифицирани всички файлове в локалната файлова система. По-строга политика би могла да бъде да се разреши промяна само на съответния файл - tmpfoo
в този случай.
По-нататък в тази статия ще разгледам повече подробности за файла с правилата, включително синтаксиса на записите. Но първо, нека разгледаме защитата на аплета и да я сравним със защитата на приложенията.
Защита на аплета
Досега проучихме сигурността на приложенията. Като такива, повечето от защитните функции могат да бъдат достъпни и модифицирани чрез командния ред. Предоставянето на адекватно сигурна и все пак донякъде гъвкава политика в аплет среда се оказва значително по-голямо предизвикателство. Ще започнем, като разгледаме разполагането на аплет в Appletviewer
. По-късно ще разгледаме приложените в браузъра аплети.
Политиката на Java кода се диктува предимно от CodeSource
, която включва две части: мястото, откъдето произхожда кодът и лицето, което го е подписало.
Appletviewer
Създайте файл, наречен writeFile.html
със следното съдържание:
Пример за защита на Java: Писане на файлове